在ubuntu上使用cElementTree进行分段错误(核心转储)

时间:2017-04-30 01:07:18

标签: python linux ubuntu elementtree celementtree

我使用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()相当长,但如果有人感兴趣,我可以使它可用。

1 个答案:

答案 0 :(得分:0)

确定它是否会对任何人有所帮助,但我找到了设定故障的原因。它实际上并没有连接到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 

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