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

时间:2016-07-13 13:54:51

标签: 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>***</item>
<item>***</item>
...
</items>
</root>

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

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

此代码仍会占用大量内存,也需要很长时间(15秒)。 我尝试使用&#34; break&#34;,它得到相同的结果,但速度更快(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

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

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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

考虑这两个循环:

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

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

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

与你的代码类似,你的非中断循环必须运行超过5亿行,即使它会立即找到唯一的<status>