繁体   English   中英

使用太多RAM在python中处理XML文件

[英]Processing XML file in python using too much RAM

我有一个XML文件,大约30MB,其中大约有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的内存。 为什么这么简单的脚本和这么小的文件占用大量内存?

最好的祝福,

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

标准库同时具有SAX解析器ElementTree.iterparse选项。

快速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()调用; 释放元素并将其从内存中删除。

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

但是,您可能需要考虑使用SAX风格的XML解析器(Python中为xml.sax )。 在这种类型的解析器中,您的代码在解析器处理它时会通过回调看到每个元素(标签,文本等)。 SAX样式的解析器不保留任何文档结构; 实际上,仅考虑了一个XML元素。 因此,它既快速又高效。 如果您的解析需求很复杂,那么使用它可能会很痛苦,但是看起来您的需求非常简单。

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

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

pip安装lxml错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM