Python使用cElementTree.iterparse解析XML的内存不足

时间:2011-10-08 15:12:27

标签: python memory-management memory-leaks elementtree

我的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,一个整数。为什么这样做:

enter image description here

最后看到内存和CPU使用量的突然下降?这是Python的惊人崩溃。至少它给了我MemoryError(取决于我在循环中做了什么,它给了我更多的随机错误,比如IndexError)和堆栈跟踪而不是段错误。但为什么会崩溃呢?

2 个答案:

答案 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