对元素进行pythonxml迭代需要大量内存

2024-04-25 20:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的XML中的一个元素是M(代表member),它是HH(househouse)的子元素-

也就是说,每个家庭都有一个或多个成员。你知道吗

我需要做的是把满足某些条件的所有成员(条件可以改变,可以是家庭成员,也可以是家庭成员——例如,只有来自高收入家庭的成员(对家庭的限制),世卫组织的年龄在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'''

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

任何帮助都将不胜感激。。。你知道吗


Tags: theintree元素forifhh家庭
1条回答
网友
1楼 · 发布于 2024-04-25 20:27:39

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

相关问题 更多 >

    热门问题