我正在使用带有最新 lxml 库的 python 2.7。我正在解析一个具有非常同质结构和数百万个元素的大型 XML 文件。我认为 lxml 的 iterparse
在解析时不会构建内部树,但显然它会构建内部树,因为内存使用量会增加直到崩溃(大约 1GB)。有没有一种方法可以在不使用大量内存的情况下使用 lxml 解析大型 XML 文件?
我看到了 target parser interface作为一种可能性,但我不确定这是否会更好。
最佳答案
尝试使用 Liza Daly 的 fast_iter :
def fast_iter(context, func, args=[], kwargs={}):
# http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
# Author: Liza Daly
for event, elem in context:
func(elem, *args, **kwargs)
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
del context
fast_iter
在解析后从树中移除元素,以及不再需要的先前元素(可能带有其他标签)。
可以这样使用:
import lxml.etree as ET
def process_element(elem):
...
context=ET.iterparse(filename, events=('end',), tag=...)
fast_iter(context, process_element)
关于python - 使用 iterparse() 解析大型 XML 会消耗太多内存。还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7972823/