У меня есть этот большой файл 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)