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

zhi*_*ong 5 python memory lxml

所有,

我有一个巨大的xml文件,需要先检查root中"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>
Run Code Online (Sandbox Code Playgroud)

我尝试按如下方式处理文件(忽略命名空间):

from lxml import etree
status = etree.iterparse('file.xml', tag='status')
for event, element in status:
    value = element.text
    element.clear()
del status
Run Code Online (Sandbox Code Playgroud)

这段代码仍然会占用大量内存,也需要很长时间(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
Run Code Online (Sandbox Code Playgroud)

在运行第一个状态后似乎发生了一些事情,但由于状态中只有一个元素,我想知道处理的是什么?任何人都知道发生了什么?非常感谢

Rob*_*obᵩ 1

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

是的。它正在徒劳地寻找第二状态。

如果没有中断,您的循环必须处理整个文件。循环搜索所有标签<status>。如果不读完文件,它就无法知道是否找到了最终标签。

或者,通过中断,循环立即停止。

考虑这两个循环:

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

for i in range(1000000):
    if i == 1:
        print(i)
        break
Run Code Online (Sandbox Code Playgroud)

希望您可以看到第一个循环必须运行一百万次,即使它会立即找到唯一的1

与您的代码类似,您的非中断循环必须运行大量行,即使它会立即找到唯一的<status>