1

我正在使用 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。

4

2 回答 2

2

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

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

于 2012-06-26T22:37:22.757 回答
0

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

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

于 2014-08-18T16:43:16.807 回答