2010-09-14 111 views

回答

5

大多数DOM库(如ElementTree)都在核心中构建了整个文档模型。传统上,当您的模型太大而无法一次装入内存时,您需要使用更多面向流的解析器,如xml.sax

这通常比您期望的要难,特别是在用于像一次处理整个DOM的高阶操作时。

有没有可能是你的XML文档而不是简单的像

<entries> 
    <entry>...</entry> 
    <entry>...</entry> 
</entries> 

这将让你更ElementTree的友好的方式对数据子集的工作?

+0

非常感谢。 – zhangwf 2010-09-15 07:45:50

2

我见过,可以处理这种在所有的事物的API是pulldom:

http://docs.python.org/library/xml.dom.pulldom.html

Pulldom使用SAX API构建部分DOM节点;通过将特定的子树作为一个组提取,然后在完成时丢弃它们,您可以通过使用DOM的完整性来获得SAX的内存效率。

这是一个不完整的API;当我使用它时,我不得不修改它以使其完全可用,但它作为基础。我不再使用它了,所以我不记得我必须添加什么;只是提前警告。

这很慢。

XML是处理大型数据集的非常差的格式。如果您对源数据有任何控制权,并且对数据集合有意义,那么将数据拆分为可以完全分析到内存中的较小块,会更好。

另一种选择是使用SAX API,但他们非常痛苦地直接做任何不平凡的事情。

11

检查出iterparse()函数。关于如何使用它来分析非常大的文档的描述可以在here找到。

+0

iterparse()函数将解决您的问题,我最近通过iterparse帮助我最近解析了一个1GB xml文档。 – 2012-10-03 01:40:37