【问题标题】:Segmentation fault (core dumped) with cElementTree on ubuntu在 ubuntu 上使用 cElementTree 进行分段错误(核心转储)
【发布时间】:2017-04-30 01:07:18
【问题描述】:

我正在使用 python 脚本和 cElementTree 包在 linux ubuntu 机器上解析 xml 文件。一段时间后(每次都在同一点)它会导致错误

Segmentation fault (core dumped)

这似乎是一个 C 错误,因此我认为它与我正在使用的 C 库 (cElementTree) 相关联。但是,我有点卡在如何调试这个问题上。如果我在本地 Macbook 上运行相同的程序,它可以正常工作,没有任何问题。只有在linux服务器上才会崩溃? 我该如何调试呢?有人知道linux中cElementTree的问题吗?

这是我的代码

import xml.etree.cElementTree as ET
def fill_pubmed_papers_table(list_of_files):
    for f in list_of_files:
        print "read file %s" % f
        inF = gzip.open(f, 'rb')
        tree = ET.parse(inF)
        inF.close()
        root = tree.getroot()
        papers = root.findall('PubmedArticle')
        root.clear()
        for i, citation in enumerate(papers):
            write_to_db(citation)
    return 

解析脚本 write_to_db() 相当长,但如果有人感兴趣,我可以提供。

【问题讨论】:

    标签: python linux ubuntu elementtree celementtree


    【解决方案1】:

    好的不确定它是否会帮助任何人,但我找到了设置错误的原因。它实际上并没有连接到 cElementTree,而是连接到读入的文件。我不完全理解为什么会发生这种情况,但是如果我在循环结束时删除论文列表,我的代码可以正常工作,这意味着我将代码更改为

    def fill_pubmed_papers_table(list_of_files):
        for i, f in enumerate(list_of_files):
            print "read file %d names %s" % (i, f)
            inF = gzip.open(f, 'rb')
            tree = ET.parse(inF)
            inF.close()
            root = tree.getroot()
            papers = root.findall('PubmedArticle')
            print "number of papers = ", len(papers)
            # we don't need anything from root anymore
            root.clear()
            for citation in papers:
                write_to_db(citation)
            # If I do not release memory here I get segfault on the linux server
            del papers
            gc.collect()
        return 
    

    我还添加了垃圾收集器以防万一,但它实际上并不需要...删除论文列表是解决问题的方法...我猜它与内存有关(?)

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多