2

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

此致,

4

3 回答 3

5

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

标准库为您提供了SAX 解析器ElementTree.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()通话;释放元素并将其从内存中删除。

于 2012-09-06T15:31:49.657 回答
0

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

但是,您可能需要考虑使用 SAX 样式的 XML 解析器( Python 中的xml.sax)。在这种类型的解析器中,您的代码在解析器处理每个元素(标签、文本等)时通过回调来查看它。SAX 风格的解析器不保留文档结构;实际上,只考虑一个 XML 元素。因此,它快速且节省内存。如果您的解析需求很复杂,使用起来可能会很痛苦,但您的解析需求似乎非常简单。

于 2012-09-06T15:35:14.070 回答
0

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

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

pip安装lxml错误

于 2012-09-06T15:49:40.707 回答