Настройка синтаксического анализа производительности XML - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь проанализировать 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)

Перепробовал еще несколько вариантов, но ничего не работало или не работает вечно. Пожалуйста, предложите.

...