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

标签 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 似乎与同时使用 A 相同。

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

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

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

最佳答案

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

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

关于python - 为什么 elementtree.ElementTree.iterparse 使用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216662/

相关文章:

node.js - 如何防止javascript中的内存泄漏

java - JMM 中的因果关系要求

python - 从多个位置读取相同的文件名

java - 简单的框架。不要将某些变量序列化为 xml

xml - XML Schema 1.0 中是否有 <assert> 的替代方案

ruby - 让 Nokogiri 决定是否使用 #fragment 还是 #parse

c - 解析二进制数据时使用属性打包的结构

python - 为什么我从 HoloViews 保存的 Datashader 绘图的分辨率这么低?

python - 通过 sendgrid-python API lib 将 django 对象上下文传递给 sendgrid 电子邮件

python - 如何避免 python 中的防御条件?