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

Ail*_*lyn 19 python memory-leaks memory-management 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))
Run Code Online (Sandbox Code Playgroud)

这会导致Python耗尽内存,这并没有多大意义.我实际存储的唯一东西是count,一个整数.为什么这样做:

在此输入图像描述

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

Joh*_*hin 12

文档告诉你" 逐步将XML部分解析为元素树 [我的重点]",但没有涵盖如何避免保留不感兴趣的元素(可能是所有元素).这是由覆盖本文由effbot.

我强烈建议所有使用的人.iterparse()都应该阅读Liza Daly撰写的这篇文章.它涵盖了两者lxml和[c] ElementTree.

以前关于SO的报道:

对大型XML文件使用Python Iterparse
Python xml ElementTree可以解析一个非常大的xml文件吗?
在Python中解析大型XML文档的最快方法是什么?


jfs*_*jfs 6

代码示例:

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
Run Code Online (Sandbox Code Playgroud)