Python 为什么大型xml解析不能按预期在这里工作?

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

下面有一个片段,在解析大型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(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”还是我遗漏了什么?也许你可以提供一个输入样本。