当只有一个元素存在时,python lxml会消耗大量内存

当只有一个元素存在时,python lxml会消耗大量内存,python,memory,lxml,Python,Memory,Lxml,全部, 我有一个巨大的xml文件,需要首先检查根目录中“status”标记的值。它消耗的内存甚至是处理tag=item时的两倍。我不知道为什么。 我在ubuntu 14.04中使用lxml版本2.3.2和python 2.7.3。 xml的结构如下所示: <root> <status>s_value</status> <count>c_value</count> <items> <item>***</ite

全部,

我有一个巨大的xml文件,需要首先检查根目录中“status”标记的值。它消耗的内存甚至是处理tag=item时的两倍。我不知道为什么。 我在ubuntu 14.04中使用lxml版本2.3.2和python 2.7.3。 xml的结构如下所示:

<root>
<status>s_value</status>
<count>c_value</count>
<items>
<item>***</item>
<item>***</item>
...
</items>
</root>
这段代码仍然占用大量内存,而且需要很长时间(15秒)。 我试着用了一个“break”,它得到了同样的结果,但是速度要快得多(1s),看不到内存的使用情况,因为它很快

from lxml import etree
status = etree.iterparse('file.xml', tag='status')
for event, element in status:
    value = element.text
    element.clear()
    break
del status
在运行第一个状态之后似乎发生了一些事情,但是由于状态中只有一个元素,我想知道处理了什么? 有人知道发生了什么事吗?非常感谢

在运行第一个状态之后似乎发生了一些事情

对。它在徒劳地寻找第二种状态

没有中断,循环必须处理整个文件。循环搜索所有
标记。如果不将文件读到底,它就无法知道是否找到了最终标记

或者,在中断时,循环立即停止

考虑这两个循环:

for i in range(1000000):
    if i == 1:
        print(i)

for i in range(1000000):
    if i == 1:
        print(i)
        break
希望您能看到第一个循环必须运行一百万次,即使它会立即找到唯一的
1


与代码类似,非中断循环必须在无数行上运行,即使它会立即找到唯一的

@Backtrack,是的,这就是为什么我尝试使用“break”来查看性能,但与“status”循环一样,它应该只有一个元素,然后有或没有“break”,我认为应该是一样的。另外,请记住,这是一个包装器,所以罪魁祸首可能不一定是Python包装器……你说它比处理tag=item时消耗的内存还要多,是什么意思?还有你的档案有多大?@padraiccnningham,谢谢你的回复。我正在使用“ps aux”检查ubuntu中的CPU和内存使用情况。如果使用与etree.iterparse('file.xml',tag='item')相同的方法,内存成本大约为5%-8%。但是当进程标记为'status'时,它可以使用大约15%-20%。我的xml文件大约有400米。@wu4m4n,谢谢你的评论,因为我们的要求是将xml转换为csv,这就是为什么我们使用ET lib来做这项工作。但我认为您是对的,如果xmljson使处理大型xml文件变得更容易,您可以使用xml转换为json,然后转换为csv。
for i in range(1000000):
    if i == 1:
        print(i)

for i in range(1000000):
    if i == 1:
        print(i)
        break