0

我希望使用 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()

我也没有太多运气。

我能做些什么来改善这一点?我也对全新的方法持开放态度。

4

0 回答 0