我的XML解析函数的简化版本在这里:
import xml.etree.cElementTree as ET
def analyze(xml):
it = ET.iterparse(file(xml))
count = 0
for (ev, el) in it:
count += 1
print('count: {0}'.format(count))
这导致Python耗尽内存,这并没有多大意义。我实际存储的唯一东西是count,一个整数。为什么这样做:
最后看到内存和CPU使用量的突然下降?这是Python的惊人崩溃。至少它给了我MemoryError
(取决于我在循环中做了什么,它给了我更多的随机错误,比如IndexError
)和堆栈跟踪而不是段错误。但为什么会崩溃呢?
答案 0 :(得分:12)
The documentation确实告诉你“逐步将XML部分解析为元素树 [我的重点]”,但不包括如何避免保留不感兴趣的元素(可能是全部他们)。这由this article by the effbot涵盖。
我强烈建议使用.iterparse()
的任何人阅读this article by Liza Daly。它涵盖了lxml
和[c] ElementTree。
以前对SO的报道:
Using Python Iterparse For Large XML Files
Can Python xml ElementTree parse a very large xml file?
What is the fastest way to parse large XML docs in Python?
答案 1 :(得分:4)
代码示例:
import xml.etree.cElementTree as etree
def getelements(filename_or_file, tag):
context = iter(etree.iterparse(filename_or_file, events=('start', 'end')))
_, root = next(context) # get root element
for event, elem in context:
if event == 'end' and elem.tag == tag:
yield elem
root.clear() # preserve memory