全部,
我有一个巨大的 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/