所有
我有一个巨大的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
在运行第一个状态后似乎发生了一些事情,但由于状态中只有一个元素,我想知道处理的是什么? 任何人都知道发生了什么?非常感谢
答案 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>
。