首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ubuntu上使用cElementTree分割故障(核心转储)

在ubuntu上使用cElementTree分割故障(核心转储)
EN

Stack Overflow用户
提问于 2017-04-30 09:07:18
回答 1查看 243关注 0票数 0

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

代码语言:javascript
复制
Segmentation fault (core dumped)

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

以下是我的代码

代码语言:javascript
复制
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()相当长,但如果有人感兴趣,我可以将其提供给您。

EN

回答 1

Stack Overflow用户

发布于 2017-04-30 21:32:12

好吧,我不确定它是否会对任何人有帮助,但我找到了set故障的原因。它实际上并没有连接到cElementTree,而是连接到了读入的文件。我不完全理解为什么会发生这种情况,但是如果我删除了循环末尾的论文列表,这意味着我将代码更改为

代码语言:javascript
复制
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 

我还添加了垃圾收集器以防万一,但它实际上并不需要……删除论文列表就解决了这个问题...我猜这和记忆有关(?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43701935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档