使用Element Tree解析大型XML文件时发生内存泄漏

时间:2018-09-10 07:56:54

标签: python xml parsing memory-management

我一直在python中使用元素树来解析大小为66 GB的xml文件,以创建倒排索引。该文件是Wikipedia XML,其中包含17000000个标记中的<page>个文档。

从网上我收集到的与解析大量数据有关的信息中,我对使用elem.clear()感到很熟悉,该8000在使用每个标签后都会释放分配给它的内存。读取所有8000个文档之后,我将其写入文件中,清除用于处理这些15GB文件数据的变量所消耗的内存,然后重新开始。

到目前为止,我已经可以解析def parseXML(xmlfile): newsitems = [] tempcnt=1 pageSize=8000 stop_words = set(stopwords.words('english')) nsmap={} totalWords=0 invertedIndexNo=1 news={} for event, elem in ET.iterparse(xmlfile, events=('start','end','start-ns','end-ns')): if event=='start-ns': ns,url=elem nsmap[ns]=url if event=='end': if elem.tag==fixtag('','id',nsmap) and elem.text is not None: if news.get('i')==None: news['i']=elem.text.encode('utf-8') elif elem.tag==fixtag('','title',nsmap) and elem.text is not None: news['t']=elem.text.encode('utf-8') elif elem.tag==fixtag('','text',nsmap) and elem.text is not None: news['b'], news['r'], news['g']=giveBodyRefCateg(elem.text) elif elem.tag==fixtag('','page',nsmap) and len(news)>0: newsitems.append(news) tempcnt+=1 news={} elem.clear() # if getsizeof(newsitems)>0.1*1000*1000: if tempcnt>pageSize: invertedIndex=refine(newsitems,stop_words) writeBlockInvertedIndex(invertedIndex,invertedIndexNo) print(\"The size:\",getsizeof(newsitems),getsizeof(invertedIndex)) invertedIndexNo+=1 tempcnt=1 totalWords+=len(invertedIndex) del newsitems[:] del invertedIndex gc.collect() invertedIndex=refine(newsitems,stop_words) writeBlockInvertedIndex(invertedIndex,invertedIndexNo) totalWords+=len(invertedIndex) del newsitems[:] return invertedIndexNo,totalWords 个文件了,没有任何问题,但是现在我的笔记本电脑已经减速到几乎死机的状态。谁能告诉我内存泄漏在哪里?

我为编写和编写倒排索引编写的函数没有任何参考周期。因此,假设从这些函数返回后,所有变量都会自动释放。另外,我没有使用任何全局列表或字典,这些列表或字典在任何这些函数中的大小都在不断增加。一旦为该块完成写入,所有文件指针都将关闭。

{{1}}

0 个答案:

没有答案