为什么elementtree.ElementTree.iterparse使用这么多的内存?(Why

2019-06-25 19:08发布

我使用elementtree.ElementTree.iterparse解析大(371 MB)的XML文件。

我的代码基本上是这样的:

outf = open('out.txt', 'w') 
context = iterparse('copyright.xml')
context = iter(context)
dummy, root = context.next()

for event, elem in context:
    if elem.tag == 'foo':
        author = elem.text

    elif elem.tag == 'bar':
        if elem.text is not None and 'bat' in elem.text.lower():
            outf.write(elem.text + '\n')
    elem.clear()   #line A
    root.clear()   #line B

我的问题是双重的:

首先 - 我是否需要A和B(见代码片断评论)? 有人告诉我,root.clear()清除不必要的孩子,让内存不是狼吞虎咽,但这里是我的意见:采用B,而不是A是一样的使用无论是在内存占用(使用任务管理器绘制)的条款。 只使用似乎是一样同时使用。

第二 - 这是为什么仍会消耗这么多的内存? 在程序运行时,它使用约100 MB的接近尾声RAM。

我认为它是与OUTF,但是为什么呢? 是不是只是写入磁盘? 而如果它是存储数据OUTF关闭之前,我怎么能避免呢?

其他信息:我使用Python 2.7.3在Windows上。

Answer 1:

(如发布,与缩进第二行的代码,不应该运行。) http://bugs.python.org/issue14762是一个类似的问题,答案有,你应该明确每个元素(A线)。 没有看到OUTF是什么(或创建它的代码),这是很难回答第二个问题。 如果它是一个StringIO对象,答案是显而易见的。 你可能会看一看跟踪问题的第二个消息中链接的教程:

http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/



Answer 2:

使用xml.etree.cElementTree.iterparse()代替[在Python 2.x的。

生命没有时间来调试其他人的错误。



文章来源: Why is elementtree.ElementTree.iterparse using so much memory?