我有一些很大的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