2012-06-26 33 views
1

我正在使用elementtree.ElementTree.iterparse解析一个大的(371 MB)xml文件。为什么elementtree.ElementTree.iterparse使用这么多内存?

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

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有关,但为什么?它不是只写磁盘吗?如果它在存储结束之前存储这些数据,我该如何避免这种情况?

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

回答

2

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

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

+0

谢谢你的第一部分。在第二部分中,我编辑了这个问题以包含创建outf的代码行。 – russell

0

使用xml.etree.cElementTree.iterparse(),而不是[在Python 2.x的。

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

+0

在Python 3中,不建议使用'cElementTree'。我相信它在可用时会自动使用。 –

+0

好的,谢谢@TerryJanReedy。 – smci

相关问题