python - 使用 iterparse() 解析大型 XML 会消耗太多内存。还有其他选择吗?

标签 python xml memory lxml

我正在使用带有最新 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/

相关文章:

python - 使用 Google Colab 和 FFmpeg 对同一文件夹中的多个文件进行编码

json - POST 请求负载的内容类型

c# - XML 文档 (30, 14) FormatException : Input string was not in a correct format. 中存在错误?

android - 巨大的内存( native 堆)增加设置布局

Android - 内存泄漏还是?

c - 如何查看内存带宽是否已经成为瓶颈?

python - 使用 Tensorflow 2.0 进行逻辑回归?

python - 我如何让 pyinvoke 使用 python3?

javascript - "xml find"不是一个函数

python - 从 HTMLParser handle_starttag 返回数据