gpt4 book ai didi

python xml迭代元素需要大量内存

转载 作者:太空宇宙 更新时间:2023-11-03 14:20:47 25 4
gpt4 key购买 nike

我有一些非常大的 XML 文件(每个大约 100-150 MB)。

我的 XML 中的一个元素是 M(成员),它是 HH(家庭)的子元素 -

即- 每个家庭都有一名或多名成员。

我需要做的是获取满足某些条件的所有成员(条件可以改变,并且可以既针对家庭又针对成员 - 例如 - 仅来自高收入家庭的成员(对家庭的限制) ),年龄在18-49岁之间(对成员的限制)) - 并在一个相当复杂的函数中进一步处理它们。

这就是我正在做的事情:

import lxml.etree as ET
all_members=[]
tree=ET.parse(whole_path)
root=tree.getroot()
HH_str='//H' #get all the households
HH=tree.xpath(HH_str)
for H in HH:
'''check if the hh satisfies the condition'''
if(is_valid_hh(H)):
M_str='.//M'
M=H.xpath(M_str)
for m in M:
if(is_valid_member(m)):
all_members.append(m)

for member in all_members:
'''do something complicated'''

问题是它占用了我所有的内存(我有 32 GB)!如何更有效地迭代 xml 元素?

任何帮助将不胜感激...

最佳答案

etree 将消耗大量内存(是的,即使使用 iterparse()),而且 sax 确实很笨重。然而,pulldom 来救援!

from xml.dom import pulldom
doc = pulldom.parse('large.xml')
for event, node in doc:
if event == pulldom.START_ELEMENT and node.tagName == 'special':
# Node is 'empty' here
doc.expandNode(node)
# Now we got it all
if is_valid_hh(node):
...do things...

这是那些不需要使用它的人似乎都不知道的库之一。文档例如https://docs.python.org/3.7/library/xml.dom.pulldom.html

关于python xml迭代元素需要大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963080/

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