我有一个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的内存。为什么这么简单的脚本和这么小的文件会占用这么多内存呢?
最诚挚的问候,
答案 0 :(得分:4)
您需要切换到迭代解析器,它以块的形式处理XML语句,允许您清理它们之间的内存。 DOM解析器一次性将整个文档加载到内存中。
标准库包含SAX parser和ElementTree.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系统上执行此操作: