Python 加载巨大的XML文件并处理MemoryError

Python 加载巨大的XML文件并处理MemoryError,python,xml,beautifulsoup,mediawiki,Python,Xml,Beautifulsoup,Mediawiki,我有一个非常大的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):

我有一个非常大的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
现在,我将如何着手消除此错误并能够继续处理脚本。我会尝试将文件拆分为单独的文件,但我不知道这会如何影响BeautifulSoup以及XML数据,所以我不想这样做

(XML数据是来自我自愿使用的wiki的数据库转储,使用它从不同时间段导入数据,使用许多页面的直接信息)

不要使用BeautifulSoup尝试解析如此大的XML文件。改用新的。具体来说,使用将文件解析为流,在收到元素通知时处理信息,然后再次删除元素:

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文档保存在内存中,只需提取所需内容并丢弃其余内容


或者,您也可以使用;它在一个更快、功能更全的包中提供了相同的API

你有20GB的内存吗?如果没有,即使你可以让它工作,它将是无法忍受的缓慢,因为它交换进出。不过,可能有一种方法可以让您一次只对lxml之类的块进行操作。
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()