在ubuntu

时间:2017-04-30 20:50:15

标签: python gzip

运行python脚本时遇到一个kill错误。我将在下面发布代码。我的第一个调试步骤是查看/ var / log / syslog文件以查看是否报告了任何内存问题,但我找不到与被杀死事件相关的任何内容。 所以我使用python -m trace --trace flags再次运行我的代码。这显然指向gzip库,因为最后一行是

...
gzip.py(271):         self.offset += size
gzip.py(272):         return chunk
 --- modulename: gzip, funcname: read
gzip.py(242):         self._check_closed()
 --- modulename: gzip, funcname: _check_closed
gzip.py(154):         if self.closed:
 --- modulename: gzip, funcname: closed
gzip.py(362):         return self.fileobj is None
gzip.py(243):         if self.mode != READ:
gzip.py(247):         if self.extrasize <= 0 and self.fileobj is None:
gzip.py(250):         readsize = 1024
gzip.py(251):         if size < 0:        # get the whole thing
gzip.py(259):             try:
gzip.py(260):                 while size > self.extrasize:
gzip.py(261):                     self._read(readsize)
 --- modulename: gzip, funcname: _read
gzip.py(279):         if self.fileobj is None:
gzip.py(282):         if self._new_member:
gzip.py(301):         buf = self.fileobj.read(size)
Killed

我对此没有多少经验,所以我不太清楚为什么read命令会像这样失败。 我注意到的另一点是,代码现在在读取它之前没有遇到麻烦的文件时失败了,所以它不是代码本身的问题,但它似乎是一个资源问题?

这是代码

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
    return

编辑: 感谢jordanm我发现确实存在内存问题... dmesg给出了

[127692.401983] Out of memory: Kill process 29035 (python) score 307 or sacrifice child
[127692.401984] Killed process 29035 (python) total-vm:1735776kB, anon-rss:1281708kB, file-rss:0kB
[127693.132028] INFO: rcu_sched detected stalls on CPUs/tasks: {} (detected by 0, t=6045672 jiffies, g=3187114, c=3187113, q=0)
[127693.132028] INFO: Stall ended before state dump start 

有人知道如何使用更少的内存来解析xml文件吗?我有点困惑,gzip命令似乎导致错误?

1 个答案:

答案 0 :(得分:0)

这个答案是基于ivan_pozdeev和jordanm给出的建议。首先,kill命令是由内存泄漏引起的。我设法用这里描述的方法监视内存

Total memory used by Python process?

我添加了大量del命令来删除write_to_db()中对树的每个引用。我不明白为什么垃圾收集器本身并没有管理它,但它似乎可以解决问题。