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

时间:2012-09-06 15:26:50

标签: python xml performance csv

我有一个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的内存。为什么这么简单的脚本和这么小的文件会占用这么多内存呢?

最诚挚的问候,

3 个答案:

答案 0 :(得分:4)

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

标准库包含SAX parserElementTree.iterparse选项。

Quick 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()电话;释放元素并将其从内存中删除。

答案 1 :(得分:0)

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

但是,您可能需要考虑SAX样式的XML解析器(Python中的xml.sax)。在这种类型的解析器中,当解析器处理它时,您的代码通过回调查看每个元素(标记,文本等)。 SAX样式的解析器不保留文档结构;实际上,只考虑过单个XML元素。因此,它的速度快,内存效率高。如果您的解析需求很复杂,那么使用它可能会很麻烦,但看起来您的解析非常简单。

答案 2 :(得分:0)

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

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

pip install lxml error