Python的xml ElementTree能解析非常大的xml文件吗?
我正在尝试解析一个超过2GB的大文件,这个文件里面是有结构的标记数据,但我的内存不够用。请问在这种情况下,最合适的XML解析类是什么?能详细说明一下吗?
5 个回答
3
我见过的唯一能处理这种情况的API是pulldom:
http://docs.python.org/library/xml.dom.pulldom.html
Pulldom使用SAX API来构建部分的DOM节点;通过将特定的子树作为一组拉入,然后在完成后丢弃它们,你可以享受到SAX的内存效率,同时又能像使用DOM那样方便。
不过,这个API并不完整;我用的时候不得不对它进行修改才能完全使用,但它可以作为一个基础。我现在不再使用它了,所以不记得当时加了什么;只是提前提醒一下。
它的速度非常慢。
XML对于处理大数据集来说并不是一个好的格式。如果你能控制源数据,并且数据集的情况允许,最好把数据拆分成更小的部分,这样你可以完全解析到内存中。
另一种选择是使用SAX API,但直接用它做一些复杂的事情会非常麻烦。
5
大多数DOM库,比如ElementTree,都是把整个文档模型都加载到内存里的。通常情况下,当你的模型太大,无法一次性放进内存时,你就需要用一种更适合流式处理的解析器,比如xml.sax。
这通常比你想象的要复杂,特别是当你习惯于一次性处理整个DOM的时候。
你的xml文档是否可能比较简单,比如说
<entries>
<entry>...</entry>
<entry>...</entry>
</entries>
这样的话,你就可以用更适合ElementTree的方式来处理数据的部分内容了?
13
看看这个 iterparse()
函数。你可以在 这里 找到关于如何用它来解析非常大的文档的说明。