我使用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。
答案 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中]。
生命太短,无法调试其他人的错误。