迭代 SAX
我有一个像这样的xml(只是一个例子):
<xml>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
</xml>
我需要一种方法来做这样的事情:
#Sax code
for page in something:
parse(page)
How i can do this with sax?
该xml文件包含30GB数据。
I have an xml like this (just an example):
<xml>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
</xml>
I need a way to do something like this:
#Sax code
for page in something:
parse(page)
How i can do this with sax?
The xml file contains 30GB of data.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不要使用 SAX,请使用 ElementTree 代替:
elem。 clear() 调用很重要,否则您会将所有已处理的元素保留在内存中,并最终也会消耗所有 RAM。元素对象是轻量级的类似 DOM 的对象,因此与 SAX 相比,它们非常易于使用。
如果单个
page
元素太大而无法适应您的记忆,您将不得不恢复到 SAX,但我从您的示例中假设有许多小的page
元素,而不是比几个大的。Do not use SAX, use ElementTree instead:
The
elem.clear()
call is important, otherwise you will keep all the processed elements in memory and eventually consume all your RAM, too. The element objects are light-weight DOM-like objects, so they are quite easy to use, as compared to SAX.If the individual
page
elements are too large already to fit your memory, you will have to revert to SAX, but I assume from your example that there are many smallpage
elements rather than a few large ones.使用 xml.sax 执行此操作的最有效且最 Python 的方法是使用 parser.feed() 方法。
示例:
这可确保您增量读取文件并增量解析它。
由此产生的内存占用应该是最小的。
The most efficent and pythonic way to do this with xml.sax is to use the parser.feed() method.
Example:
This ensures that you're both incrementally reading the file, and incrementally parsing it.
The resulting memory footprint should be minimal.
您可以在线程中使用 sax 解析器。当它检测到完整的 fage 时,会将其推送到队列中。在主线程中,迭代队列。
You could use the sax parser in a thread. When it detects a full fage it pushes it to a queue. In your main thread, iterate over the queue.
使用 Dom 而不是 Sax , sax 在发生诸如 start element 或 text 之类的有趣内容时保持触发事件,但如果您想迭代文件,请使用 dom this 链接 可能对您有帮助。
更新:
30GB 必须使用 SAX
use Dom instead of Sax , sax keep fire event when it occur interest stuff like start element or text , but if you want to iterate over the file use dom this link may help you .
UPDATE:
with 30GB you must use SAX