我希望使用 Python 代码解析一个大型 XML 文件(~9 GB)。我知道已经有很多关于这个主题的问题,从我收集到的信息来看,解析这些大文件的推荐方法是iterparse
使用xml.etree.ElementTree
. 下面给出的是我的代码在解析数据时的样子,
elements_1 = []
elements_2 = []
element_ids = []
# get an iterable
context = ET.iterparse('path_to_file.xml', events=("start", "end"))
# turn it into an iterator
context = iter(context)
# get the root element
event, root = context.__next__()
for event, element in context:
if event == "end" and element.tag == "Element1":
if (element.find('ElementType').text in ['This', 'That']):
element1_result = tuple([child.text for child in element])
elements_1.append(element1_result)
element_ids.append(element.find('ElementID').text)
elif event == "end" and element.tag == 'Element2':
if element.find('ElementID').text in element_ids:
element2_result = tuple([child.text for child in element])
elements_2.append(element2_result)
root.clear()
data = {}
data['elements_1'] = elements_1
del elements_1
data['elements_2'] = elements_2
del elements_2
gc.collect()
现在已经运行了大约 6 个小时,看起来我没有取得太大进展。这种大小的文件正常吗?有什么方法可以改进我的代码吗?
我看到的另一种可能性如下所示(清除每个元素而不是根元素),
elements_1 = []
elements_2 = []
element_ids = []
# get an iterable
context = ET.iterparse('path_to_file.xml', events=("start", "end"))
for event, element in context:
if event == "end":
if element.tag == "Element1":
if (element.find('ElementType').text in ['This', 'That']):
element1_result = tuple([child.text for child in element])
elements_1.append(element1_result)
element_ids.append(element.find('ElementID').text)
element.clear()
elif element.tag == 'Element2':
if element.find('ElementID').text in element_ids:
element2_result = tuple([child.text for child in element])
elements_2.append(element2_result)
element.clear()
del context
data = {}
data['elements_1'] = elements_1
del elements_1
data['elements_2'] = elements_2
del elements_2
gc.collect()
我也没有太多运气。
我能做些什么来改善这一点?我也对全新的方法持开放态度。