我有一个非常大的 XML 文件(准确地说是 20GB,是的,我需要全部)。当我尝试加载该文件时,收到此错误:
Python(23358) malloc: *** mmap(size=140736680968192) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "file.py", line 5, in <module>
code = xml.read()
MemoryError
这是我当前读取 XML 文件的代码:
from bs4 import BeautifulSoup
xml = open('pages_full.xml', 'r')
code = xml.read()
xml.close()
soup = BeautifulSoup(code)
现在,我将如何消除这个错误并能够继续处理脚本。我会尝试将文件拆分为单独的文件,但由于我不知道这会如何影响 BeautifulSoup 以及 XML 数据,所以我不想这样做。
(XML 数据是来自我志愿参与的 wiki 的数据库转储,使用它导入不同时间段的数据,使用来自许多页面的直接信息)
Do not使用BeautifulSoup来尝试解析这么大的XML文件。使用元素树API http://docs.python.org/2/library/xml.etree.elementtree.html反而。具体来说,使用iterparse()功能 http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse将文件解析为流,在收到元素通知时处理信息,然后delete再次元素:
from xml.etree import ElementTree as ET
parser = ET.iterparse(filename)
for event, element in parser:
# element is a whole element
if element.tag == 'yourelement'
# do something with this element
# then clean up
element.clear()
通过使用事件驱动的方法,您永远不需要持有whole内存中的 XML 文档,您只提取需要的内容并丢弃其余的。
See the iterparse()教程和文档 http://effbot.org/zone/element-iterparse.htm.
或者,您也可以使用lxml库 http://lxml.de/;它以更快、功能更齐全的方式提供相同的 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)