加载巨大的XML文件,并处理的MemoryError(Loading huge XML files

2019-08-17 00:38发布

我有一个非常大的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,我的志愿上,用它来导入不同时间段的数据使用从许多页的直接信息的数据库转储)

Answer 1:

不要使用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更快,更featurefull包。



文章来源: Loading huge XML files and dealing with MemoryError