Анализ файла xml занимает слишком много времени - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть этот большой файл dblp. xml (2.8Gb), и я хочу записать элемент "year" в отдельный текстовый файл. Год в текстовом файле составляет примерно 6 миллионов. Я создал код, но он Это займет слишком много времени, чтобы завершить sh процесс. Есть ли другой способ ускорить процесс или написать хотя бы половину этих дат? Маленький кусочек xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp-2019-11-22.dtd">
<dblp>
<phdthesis mdate="2016-05-04" key="phd/dk/Heine2010">
<author>Carmen Heine</author>
<title>Modell zur Produktion von Online-Hilfen.</title>
<year>2010</year>
<school>Aarhus University</school>
<pages>1-315</pages>
<isbn>978-3-86596-263-8</isbn>
<ee>http://d-nb.info/996064095</ee>
</phdthesis><phdthesis mdate="2020-02-12" key="phd/Hoff2002">
<author>Gerd Hoff</author>

Код:

sys.stdout = TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

tokenizer = RegexpTokenizer(r'\w+')
with open('tags.txt') as f:
collaborations = f.read().splitlines()

def fast_iter(context):
    year = ''
    for event, elem in context:
    if elem.tag == 'year':
        if elem.text:
            year = elem.text
    if elem.tag in collaborations:
        if year:
            year = int(year)
            print('{:d}'.format(year), end='')
            print(flush=True)
            year = ''
    elem.clear()
    while elem.getprevious() is not None:
        del elem.getparent()[0]
del context


if __name__ == "__main__":
context = etree.iterparse('dblp-2020-04-01.xml', load_dtd=True, html=True)
fast_iter(context)

1 Ответ

0 голосов
/ 29 апреля 2020

Этот код запишет все годы в текстовый файл (который присутствует между тегом year).

    import re
    xml_name = 'dblp.xml'
    txt_file = 'tags.txt'
    with open(xml_name,'r') as f:
        years = f.read()
    years = re.findall('<year>(.*?)</year>',years)
    with open(txt_file, 'w') as f:
        for year in years:
            f.write(year+'\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...