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

在python中使用过多RAM处理XML文件,python,xml,performance,csv,Python,Xml,Performance,Csv,我有一个大约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

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


最重要的是,

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

标准库提供了和两个选项

快速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中)。在这种类型的解析器中,您的代码在解析器处理每个元素(标记、文本等)时通过回调来查看它们。SAX风格的解析器不保留文档结构;事实上,我们只考虑一个XML元素。因此,它速度快,内存效率高。如果您的解析需求很复杂,那么处理它可能会很痛苦,但您的解析似乎非常简单。

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

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


您是如何衡量内存使用率的?请尝试使用lxml等合理的解析器。minidom不是解析器,它是原型级别的。查看“此处的某些处理”代码也会有所帮助。SAX解析器的功能有限,例如,不支持xpath,而xpath通常是认真处理XML所必需的。这里SAX解析器不是通用的解决方案。