加载大型XML文件并处理内存错误
我有一个非常大的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数据是我在一个维基网站上志愿工作时得到的数据库转储,我用它来导入不同时间段的数据,直接从很多页面获取信息)
1 个回答
21
不要用BeautifulSoup来处理这么大的XML文件。建议使用ElementTree API。特别是,使用iterparse()
函数来将文件当作流来解析,这样你可以在接收到元素时处理信息,然后再删除这些元素:
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()
通过使用事件驱动的方法,你不需要把整个XML文档都放在内存里,只提取你需要的部分,其他的就丢掉。
可以查看iterparse()
的教程和文档。
另外,你也可以使用lxml库;它提供了相同的API,但速度更快,功能更强大。