【问题标题】:Processing XML file in python using too much RAM使用太多 RAM 在 python 中处理 XML 文件
【发布时间】:2012-08-31 11:17:45
【问题描述】:

我有一个大约 30MB 的 XML 文件,里面有大约 300000 个元素。

我使用下面的代码来处理这个文件。

xmldoc=xml.dom.minidom.parse("badges.xml")

csv_out=open("badge.csv","w")

for badge in xmldoc.getElementsByTagName("row"):
    some processing here
    csv_out.write(line)

文件只有 30MB,但是当我在我的 MBP(10.7,8G RAM)上运行这个脚本时,它使用了将近 3GB 内存。为什么这么简单的脚本和这么小的文件会占用这么多内存?

最好的问候,

【问题讨论】:

  • 你如何测量内存使用情况?
  • 用像 lxml 这样的合理解析器试试。
  • minidom 不是解析器,它是原型级别的废话
  • 看看“这里的一些处理”代码也会很有帮助。

标签: python xml performance csv


【解决方案1】:

您需要切换到迭代解析器,该解析器以块的形式处理 XML 语句,从而允许您清理中间的内存。 DOM 解析器一次性将整个文档加载到内存中。

标准库有一个SAX parserElementTree.iterparse 可供您使用。

快速迭代解析示例:

from xml.etree.ElementTree import iterparse

with open("badge.csv","w") as csvout:
    for event, elem in iterparse("badges.xml"):
        if event == 'end' and elem.tag == 'row': # Complete row tag
            # some processing here
            csv_out.write(line)
            elem.clear()

注意.clear() 调用;释放元素并将其从内存中删除。

【讨论】:

  • SAX 解析器的功能有限,例如不提供对认真处理 XML 经常需要的 xpath 的支持。 SAX 解析器在这里不是一个通用的解决方案。
【解决方案2】:

DOM 类型的 XML 解析器会使用大量内存,因为它们会加载整个文档。对于 30MB 的文件来说,3GB 似乎有点过多,所以可能还有其他事情发生。

但是,您可能需要考虑使用 SAX 样式的 XML 解析器(Python 中的xml.sax)。在这种类型的解析器中,您的代码在解析器处理每个元素(标签、文本等)时通过回调来查看它。 SAX 风格的解析器不保留文档结构;实际上,只考虑一个 XML 元素。因此,它快速且节省内存。如果您的解析需求很复杂,使用起来可能会很痛苦,但您的解析需求似乎非常简单。

【讨论】:

    【解决方案3】:

    我在非常大的 xml 文件上使用 lxml,从来没有任何问题。

    请参阅此 stackoverflow 文章以获取安装帮助,因为我必须在我的 ubuntu 系统上执行此操作:

    pip install lxml error

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2011-08-22
      • 2011-11-02
      相关资源
      最近更新 更多