gpt4 book ai didi

python - 尽管清晰,lxml iterparse 仍会填充内存

转载 作者:行者123 更新时间:2023-12-03 22:45:14 27 4
gpt4 key购买 nike

我正在尝试解析 xml。第一个 iterparse 工作正常,但第二个开始填充内存。如果删除第一个 iterparse,则什么都不会改变。Xml 有效。

def clear_element(e):
e.clear()
while e.getprevious() is not None:
del e.getparent()[0]

def import_xml(request):
f = 'file.xml'
offers = etree.iterparse(f, events=('end',), tag='offer')
for event, offer in offers:
# processing
# works correctly
clear_element(offer)

categories = etree.iterparse(f, events=('end',), tag='category')
for event, category in categories:
# using memory
clear_element(category)

XML:

<shop>
<categories>
<category>name</category>
<category>name</category>
<category>name</category>
~ 1000 categories
</categories>
<offers>
<offer>
<inner_tag>data</inner_tag>
<inner_tag>data</inner_tag>
</offer>
<offer>
<inner_tag>data</inner_tag>
<inner_tag>data</inner_tag>
</offer>
~ 450000 offers
</offers>
</shop>

最佳答案

您要解析文件两次,第一次是保留所有 category 标签并删除 offer 标签,这对于 1000 个 category 标签不会占用那么多内存。

但是第二次您只删除 category 标签,同时保留所有 450000 个 offer 标签,这就是构建树需要大量内存的原因。

在这种情况下,最好不要将 tag 参数用于 iterparse 并检查标记名,同时删除所有不需要的标记:

def import_xml(request):
f = 'file.xml'
elements = etree.iterparse(f, events=('end',))
for event, element in elements:
if element.tag == 'offer':
# handle offer ...
elif element.tag == 'category':
# handle category ...
else:
continue
element.clear()
element.getparent().remove(element)

注意:仅调用 element.clear() 而不从父元素中删除它仍然会将已清除的元素作为构造树的一部分保留在内存中。可能真的不需要 clear...

关于python - 尽管清晰,lxml iterparse 仍会填充内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26433866/

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