Python 为什么大型xml解析不能按预期在这里工作?
下面有一个片段,在解析大型XML(>1GB)时,它应该占用一个常量内存。但是,这需要花费相当多的时间。在这里找不到流动。有人帮忙吗Python 为什么大型xml解析不能按预期在这里工作?,python,python-3.x,xml-parsing,lxml,Python,Python 3.x,Xml Parsing,Lxml,下面有一个片段,在解析大型XML(>1GB)时,它应该占用一个常量内存。但是,这需要花费相当多的时间。在这里找不到流动。有人帮忙吗 from urllib.request import urlopen import gzip import csv from pprint import pprint from lxml import etree response = urlopen("https://host/feed.xml.gz") response = gzip.GzipFile(fil
from urllib.request import urlopen
import gzip
import csv
from pprint import pprint
from lxml import etree
response = urlopen("https://host/feed.xml.gz")
response = gzip.GzipFile(fileobj=response)
context = etree.iterparse(response, events=("start", "end"))
context = iter(context)
_, root = next(context)
csvfile = open('output.csv', 'w', newline='')
filt = 'some keyword, more keyword' # there is about 100 approximately
filt = [i.lower() for i in filt.split(',')]
fieldnames = ['title', 'company']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for event, job in context:
if event == "end" and job.tag == "job":
title = job.find('title').text
title_as_lower = title.lower()
for f in filt:
if f in title_as_lower:
company = job.find('company').text
writer.writerow({'title': title, 'company': company})
root.clear()
csvfile.close()
看看这个答案。@JohnGordon,好吧,我早些时候就遇到过这个问题。问题基本上是如果我不清除elementtree,它会变得越来越大,所以最初的方法是在处理完元素后立即清除它(如您建议的答案所示)。但是,人们发现,如果xml太大,即使清除每个元素都不够,树也会水平生长,并且仍然会消耗内存。因此,我们的想法是清除根元素本身。如果您能在我的代码中提及流程,我将不胜感激。那将是一个很大的帮助。谢谢。
root
只分配一次。在第二次(或第三次、第四次等)清除它不会有任何效果。一些小疑问:“context=iter(context)”似乎没用,不是吗?“\ux,root=next(context)”似乎没用,不是吗?代码在结束标记上使用了“find”还是我遗漏了什么?也许你可以提供一个输入样本。