Я пытаюсь проанализировать 17G XML-файл. Мне нужно прочитать все атрибуты каждого тега () и сохранить их в формате CSV. Я использую следующий код для разбора XML. Разбор занимает слишком много времени. Например, для экспорта 10000 строк требуется более 5 минут. У меня машина с Windows (Intel i5 2,4 ГГц / 8 ГБ ОЗУ).
Пример XML
<?xml version="1.0" encoding="utf-8"?>
<comments>
<row Id="2" PostId="35314" Score="8" Text="Yeah, I didn't believe it until I created a console app - but good lord! Why would they give you the rope to hang yourself! I hated that about VB.NET - the OrElse and AndAlso keywords!" CreationDate="2008-09-06T08:09:52.330" UserId="3" />
</comments>
Код Python
import xml.etree.ElementTree as etree
import pandas as pd
df = pd.DataFrame(columns=('Id','PostId','Score','Text','CreationDate','UserId'))
def process_params(elem):
global df
row = [elem.attrib.get('Id'),elem.attrib.get('PostId'),elem.attrib.get('Score'),elem.attrib.get('Text'),elem.attrib.get('CreationDate'),elem.attrib.get('UserId')]
df.loc[len(df)] = row
if (len(df) % 10000 == 0):
with open('xaa.csv', 'a', encoding="utf-8") as f:
df.to_csv(f, header=False)
print("{} rows exported".format(len(df)))
for event, elem in etree.iterparse("xaa.xml", events=('start', 'end')):
if event == 'start':
if elem.tag == 'row':
process_params(elem)
Попробовал другой вариант кода без Pandas, который не работает из-за сбоя памяти
def process_params(elem):
row = [elem.attrib.get('Id'),elem.attrib.get('PostId'),elem.attrib.get('Score'),elem.attrib.get('Text'),elem.attrib.get('CreationDate'),elem.attrib.get('UserId')]
with open("comments1.csv", "a", encoding="utf-8") as f:
wr = csv.writer(f)
wr.writerow(row)
for event, elem in etree.iterparse("comments.xml", events=('start', 'end')):
if event == 'start':
if elem.tag == 'row':
process_params(elem)
Перепробовал еще несколько вариантов, но ничего не работало или не работает вечно. Пожалуйста, предложите.