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)
在运行第一个状态后似乎发生了一些事情,但由于状态中只有一个元素,我想知道处理的是什么?任何人都知道发生了什么?非常感谢
运行第一个状态后似乎发生了一些事情
是的。它正在徒劳地寻找第二状态。
如果没有中断,您的循环必须处理整个文件。循环搜索所有标签<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>。