当只有一个元素存在时,python 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>***</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 秒)。 我尝试使用“break”,结果相同,但速度更快(1 秒),看不到内存使用情况,因为速度很快。

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

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

最佳答案

It seems something happen after run the first status

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

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

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

考虑这两个循环:

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

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

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

与您的代码类似,您的不间断循环必须运行无数行,即使它会找到唯一的 <status>。立即。

关于当只有一个元素存在时,python lxml 会占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38353720/

相关文章:

python - 使用 lxml 解析具有多个命名空间的 xml

javascript - 在 python 中部署时合并 javascript 文件

python - 如何显示集合中的用户名而不是 flask 中的用户名?

python - 导入 PyQt4 不包括 PyQt4.QtCore 或 QtGui

python - 当在Python中的步骤中给出IP地址时增加IP地址

performance - 堆栈是否在缓存中?

python - 为什么 etree.find 找不到所提供示例的元素

c++ - Direct3D11 在哪里分配资源对象?

c++ - top 如何查看内存使用情况

python - 使用 lxml 覆盖 XML 中的文本