- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过一个 XML 文档的 iterparse()
进行增量解析,该文档(设计为)太大而无法放入内存。我发现即使对文档执行无操作传递也会耗尽进程内存并导致我的系统开始交换。
期望 xml.etree.ElementTree.iterparse()
在与 XML 文档大小无关的常量内存中运行是错误的吗?如果是这样,用于对任意长的 XML 文档进行增量解析的推荐包是什么?如果没有,WTF 是我的代码有问题吗?
这是代码:
请注意,我仅请求“开始”事件(因此解析器不会在返回文档根元素的结束标记(在我的情况下为
del()
强制他们被释放。
考虑到垃圾收集器可能没有机会运行,因为循环没有产生,我每百万次迭代添加了对
gc.collect()
和
time.sleep()
的显式调用。但它没有帮助。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import pprint
import gc
import time
import os
import psutil
def gcStats(myProc):
# return human readable gc.stats for 3 generations
extmem = myProc.memory_info_ex()
a = "extmem: rss {:12n}, vms {:12n}, shared{:12n}, text{:12n}, lib {:12n}, data{:12n}, dirty{:12n}".format(
extmem.rss, extmem.vms, extmem.shared, extmem.text, extmem.lib, extmem.data, extmem.dirty)
return a + "\tgc enabled {}, sumCount {:n}, lenGarbage {:n}".format( gc.isenabled(), sum(gc.get_count()), len(gc.garbage))
# the misbehaving code:
def count_tags(filename):
retVal = {}
iterCount = 0
sleepTime = 2.0
myProc = psutil.Process()
print("Starting: gc.isenabled() == {}\n{}".format(gc.isenabled(), gcStats( myProc)))
for event, element in ET.iterparse(filename, ('start',)):
assert event == 'start'
if iterCount % 1000000 == 0:
print('{} iterations, sleeping {} sec...'.format(iterCount, sleepTime))
time.sleep( sleepTime)
print('{}\nNow starting gc pass...'.format( gcStats( myProc)))
gcr = gc.collect()
print('gc returned {}'.format( gcr))
iterCount += 1
del element
del event
return retVal
if __name__ == "__main__":
tags = count_tags('/home/bobhy/MOOC_Data/' + 'chicago.osm')
<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="Osmosis 0.43.1">
<bounds minlon="-88.50500" minlat="41.33900" maxlon="-87.06600" maxlat="42.29700" origin="http://www.openstreetmap.org/api/0.6"/>
<node id="219850" version="54" timestamp="2011-04-06T05:17:15Z" uid="207745" user="NE2" changeset="7781188" lat="41.7585879" lon="-87.9101245">
<tag k="exit_to" v="Joliet Road"/>
<tag k="highway" v="motorway_junction"/>
<tag k="ref" v="276C"/>
</node>
<node id="219851" version="47" timestamp="2011-04-06T05:18:47Z" uid="207745" user="NE2" changeset="7781188" lat="41.7593116" lon="-87.9076432">
<tag k="exit_to" v="North I-294 ; Tri-State Tollway; Wisconsin"/>
<tag k="highway" v="motorway_junction"/>
<tag k="ref" v="277A"/>
</node>
<node id="219871" version="1" timestamp="2006-04-15T00:34:03Z" uid="229" user="LA2" changeset="3725" lat="41.932278" lon="-87.9179332"/>
<node id="700724" version="14" timestamp="2009-04-13T11:21:51Z" uid="18480" user="nickvet419" changeset="485405" lat="41.7120272" lon="-88.0158606"/>
<relation id="3366425" version="1" timestamp="2013-12-07T21:37:35Z" uid="239998" user="Sundance" changeset="19330301">
<member type="way" ref="250651738" role="outer"/>
<member type="way" ref="250651748" role="inner"/>
<tag k="type" v="multipolygon"/>
</relation>
<relation id="3378994" version="1" timestamp="2013-12-14T22:24:26Z" uid="371121" user="AndrewSnow" changeset="19456337">
<member type="way" ref="251850076" role="outer"/>
<member type="way" ref="251850073" role="inner"/>
<member type="way" ref="251850074" role="inner"/>
<member type="way" ref="251850075" role="inner"/>
<tag k="type" v="multipolygon"/>
</relation>
<relation id="3382796" version="1" timestamp="2013-12-17T03:21:18Z" uid="567034" user="Umbugbene" changeset="19492258">
<member type="way" ref="252225400" role="outer"/>
<member type="way" ref="252225404" role="inner"/>
<tag k="type" v="multipolygon"/>
</relation>
</osm>
Starting: gc.isenabled() == True
extmem: rss 9097216, vms 37199872, shared 3145728, text 3301376, lib 0, data 5820416, dirty 0 gc enabled True, sumCount 410, lenGarbage 0
0 iterations, sleeping 2.0 sec...
extmem: rss 9097216, vms 37335040, shared 3145728, text 3301376, lib 0, data 5955584, dirty 0 gc enabled True, sumCount 87, lenGarbage 0
Now starting gc pass...
gc returned 0
1000000 iterations, sleeping 2.0 sec...
extmem: rss 1234309120, vms 1262891008, shared 3280896, text 3301376, lib 0, data 1231511552, dirty 0 gc enabled True, sumCount 372, lenGarbage 0
Now starting gc pass...
gc returned 0
2000000 iterations, sleeping 2.0 sec...
extmem: rss 2495262720, vms 2524073984, shared 3280896, text 3301376, lib 0, data 2492694528, dirty 0 gc enabled True, sumCount 37, lenGarbage 0
Now starting gc pass...
gc returned 0
3000000 iterations, sleeping 2.0 sec...
extmem: rss 3781947392, vms 3812208640, shared 3280896, text 3301376, lib 0, data 3780829184, dirty 0 gc enabled True, sumCount 262, lenGarbage 0
Now starting gc pass...
gc returned 0
4000000 iterations, sleeping 2.0 sec...
extmem: rss 5067837440, vms 5096787968, shared 3280896, text 3301376, lib 0, data 5065408512, dirty 0 gc enabled True, sumCount 241, lenGarbage 0
Now starting gc pass...
gc returned 0
5000000 iterations, sleeping 2.0 sec...
extmem: rss 6345998336, vms 6375632896, shared 3063808, text 3301376, lib 0, data 6344253440, dirty 0 gc enabled True, sumCount 333, lenGarbage 0
Now starting gc pass...
gc returned 0
6000000 iterations, sleeping 2.0 sec...
extmem: rss 7266795520, vms 7665147904, shared 1060864, text 3301376, lib 0, data 7633768448, dirty 0 gc enabled True, sumCount 877, lenGarbage 0
Now starting gc pass...
最佳答案
您需要通过调用方法 element.clear()
来明确清除不再需要的元素。 ,否则它仍然会留在内存中。这意味着您可能还想听 'end'
事件及调用 clear()
一旦到达封装元素的末尾,您就知道不再需要它的任何内容。
关于python-3.x - xml.etree.ElementTree.iterparse() 对于大型 XML 文档不可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024478/
我使用 iterparse 来解析一个大的 xml 文件 (1,8 GB)。我将所有数据写入 csv 文件。t 我制作的脚本运行良好,但由于某种原因它会随机跳行。这是我的脚本: import xml.
我正在使用 lxml iterparse 来读取巨大的 xml 文件。对于给定的 mainElement,我检查子元素并处理每个子元素。但我注意到,在检查元素中的子节点时,解析器有时实际上会丢失一些子
我想检索 XML 文件中特定元素的内容。然而,在 XML 元素中,还有其他 XML 元素,它们破坏了父标记中内容的正确提取。一个例子: xml = '''2. A protective uniform
我使用 Python 的 iterparse解析 nessus 扫描的 XML 结果(.nessus 文件)。对意外记录的解析失败,但相似的记录已被正确解析。 XML 文件的一般结构是很多记录,如下所
在回答另一个问题时,有人向我展示了以下教程,其中作者声称使用 iterparse 在 3 秒内解析了一个 ~100 MB 的 XML 文件: http://eli.thegreenplace.net/
有没有办法从lxml的lxml.etree.iterparse中得到多个标签名?我有一个类似文件的对象,它具有昂贵的读取操作和许多标签,因此获取所有标签或执行两次传递并不是最佳选择。 编辑:类似于 B
我正在尝试解析 xml。第一个 iterparse 工作正常,但第二个开始填充内存。如果删除第一个 iterparse,则什么都不会改变。Xml 有效。 def clear_element(e):
我正在尝试解析一个非常大的 XML 文件,因此我决定使用 lxml.iterparse,如所解释的 here . 所以我的代码如下所示: import sys from lxml import etr
我已经为此奋斗了一个小时。我正在用 iterparse 解析 XML 字符串.但是,数据没有正确编码,我不是它的提供者,所以我无法修复编码。 这是我得到的错误: lxml.etree.XMLSynta
如何解析大型 XML 文件并将其元素处理为 ObjectifiedElement(使用 objectify 解析器)。 我没有找到比以下更好的解决方案: from lxml import etree,
我想从文件(1.5gb 文件)中动态解析 xml,如下所示: x y URL__I_WANT_TO_PULLOUT
我不明白为什么会这样: content = urllib2.urlopen(url) context = etree.iterparse(content, tag='{my_ns}my_first_t
我有一个很大的 XML 文件,其中包含如下条目 (实际上,有多个 data 条目,它们在 XML 树中更深,但让我们保持简单。) 我想用 Python 读取这个文件并将所有
我需要整理一段代码,将一个可能很大的 XML 文件解析为自定义 Python 对象。思路大致如下: from lxml import etree for e, tag in etree.iterpar
我正在解析一个 700mb 的文件,我有以下代码在我的测试文件上运行良好,没有行 context.iter(context) 和 event, elem = context.next()。 form
过滤器是 using iterparse 解析一个简单的 XML StringIO object在unit test .但是,当之后尝试访问 StringIO 对象时,Python 会退出并显示“Va
import os import xml.etree.ElementTree as et for ev, el in et.iterparse(os.sys.stdin): el.clear(
我正在使用 elementtree.ElementTree.iterparse 来解析大型 (371 MB) xml 文件。 我的代码基本上是这样的: outf = open('out.txt', '
由于没有人回答或评论这篇文章,我决定重写这篇文章。 考虑以下使用 lxml 的 Python 代码: treeIter = etree.iterparse(fObj) for event, ele i
我想遍历 xml 文件的元素并生成每个元素,除非父元素是一个特征。 所以在伪代码中 for event, element in cElementTree.iterparse('../test.
我是一名优秀的程序员,十分优秀!