gpt4 book ai didi

python - lxml 的 iterparse 尝试将整个文件加载到内存中

转载 作者:行者123 更新时间:2023-11-30 23:24:26 24 4
gpt4 key购买 nike

我正在尝试解析一个非常大的 XML 文件,因此我决定使用 lxml.iterparse,如所解释的 here .

所以我的代码如下所示:

import sys
from lxml import etree

def fast_iter(context, func):
for event, elem in context:
func(elem)
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
del context

def launchArticleProcessing(elem):
print elem

context = etree.iterparse(sys.argv[1], events=('end',), tag='text')

fast_iter(context, launchArticleProcessing)

我这样调用它:python lxmlwtf.py "/path/to/my/file.xml"

内存就被填满了(直到我终止进程,因为文件永远装不下)并且没有打印任何内容。我在这里缺少什么?

最佳答案

我在这里回答了一个非常相似的问题:lxml and fast_iter eating all the memory主要原因是 lxml.etree 仍然保留所有未显式捕获的元素在内存中。因此需要手动清除。

我所做的并不是过滤您正在查找的标签的事件:

context = etree.iterparse(open(filename,'r'),events=('end',))

而是手动解析并清除其余部分:

for (event,elem) in progress.bar(context):
if elem.tag == 'text':
# do things here

# every element gets cleared here
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
del context

关于python - lxml 的 iterparse 尝试将整个文件加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23443026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com