Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml iterparse标记参数和内存消耗_Python_Xml_Memory_Iterparse - Fatal编程技术网

Python lxml iterparse标记参数和内存消耗

Python lxml iterparse标记参数和内存消耗,python,xml,memory,iterparse,Python,Xml,Memory,Iterparse,我正在使用lxml.iterparse处理大型xml文件。这很有效,但随着我的文件最近变得越来越大,我发现iterparse行为占据了我的记忆。考虑下面的代码,编写一个具有300000种元素的文件,一个是300000个,一个是代码,一个是EELM 元素,300000个是代码>另一个是ELSEME/元素: els = ('<elem><subel1>{0}</subel1><subel2>{0}</subel2><subel3>

我正在使用
lxml.iterparse
处理大型xml文件。这很有效,但随着我的文件最近变得越来越大,我发现iterparse行为占据了我的记忆。考虑下面的代码,编写一个具有300000种元素的文件,一个是300000个,一个是代码,一个是EELM <代码>元素,300000个是代码>另一个是ELSEME/<代码>元素:

els = ('<elem><subel1>{0}</subel1><subel2>{0}</subel2><subel3>{0}</subel3><subel4>{0}</subel4><subel5>{0}</subel5><subel6>{0}</subel6></elem>'.format(x) for x in range(300000))
other_els = ('<other_elem><subel1>{0}</subel1><subel2>{0}</subel2><subel3>{0}</subel3><subel4>{0}</subel4><subel5>{0}</subel5><subel6>{0}</subel6></other_elem>'.format(x) for x in range(300000))

with open('/tmp/test.xml', 'w') as fp:
   fp.write('<root>\n')
   fp.write('<elements>\n')
   for el in els:
       fp.write(el+'\n')
   fp.write('</elements>\n')
   fp.write('<other_elements>\n')
   for el in other_els:
       fp.write(el+'\n')
   fp.write('</other_elements>\n')
   fp.write('</root>\n')
输出显示低内存使用率,直到结束时,它突然跳转。当我试图读取不包含
其他元素的文件时,这种行为就会消失。一种较慢的解决方法,它省去了iterparse的
标记
参数,而是使用if构造来测试,从而使内存空闲,可能是因为它可以对不匹配的元素执行
el.clear()
。因此,我的问题不是如何解决这个问题,而是为什么iterparse会将内存浪费在它不必输出的元素上,或者,我在这里做错了什么

from lxml import etree
import psutil
import os

process = psutil.Process(os.getpid())
gen = etree.iterparse('/tmp/test.xml', tag='elem')
elscount = 0
for ac,el in gen:
    elscount += 1
    el.clear()
    if el.getprevious() is not None:
        del(el.getparent()[0])
    if elscount % 10000 == 0:
        print process.get_memory_info().rss/(1024*1024)

print process.get_memory_info().rss/(1024*1024)