【问题标题】:Why is elementtree.ElementTree.iterparse using so much memory?为什么 elementtree.ElementTree.iterparse 使用这么多内存?
【发布时间】:2012-06-28 07:43:04
【问题描述】:

我正在使用 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(参见代码 sn-p cmets)吗?有人告诉我 root.clear() 会清除不必要的子项,因此不会占用内存,但这是我的观察结果:在内存消耗方面,使用 B 而不是 A 与既不使用相同(使用任务管理器绘制)。仅使用 A 似乎与同时使用两者相同。

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

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

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

【问题讨论】:

    标签: python xml memory elementtree iterparse


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的第一部分。在第二部分,我编辑了问题以包含创建 outf 的代码行。
    【解决方案2】:

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

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

    【讨论】:

    • 在 Python 3 中明确使用 'cElementTree' 已被弃用。我相信它会在可用时自动使用。
    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多