为什么elementtree.ElementTree.iterparse使用了这么多内存?

时间:2012-06-26 22:09:49

标签: python xml memory elementtree iterparse

我使用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与使用内存消耗(使用任务管理器绘制)相同。仅使用A似乎与使用两者相同。

第二 - 为什么这仍然消耗如此多的记忆?程序运行时,它在末尾附近使用大约100 MB的RAM。

我认为它与outf有关,但为什么呢?是不是只写入磁盘?如果它在outf关闭之前存储该数据,我该如何避免?

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

生命太短,无法调试其他人的错误。