迭代元素的python xml会占用大量内存

问题描述 投票:1回答:1

我有一些非常大的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元素?

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

python xml list xpath generator
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.