[英]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元素。 因此,它既快速又高效。 如果您的解析需求很复杂,那么使用它可能会很痛苦,但是看起来您的需求非常简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.