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

Hai*_*irr 8 python xml mediawiki beautifulsoup

我有一个非常大的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
Run Code Online (Sandbox Code Playgroud)

这是我当前的代码,用于读取XML文件:

from bs4 import BeautifulSoup
xml = open('pages_full.xml', 'r')
code = xml.read()
xml.close()
soup = BeautifulSoup(code)
Run Code Online (Sandbox Code Playgroud)

现在,我将如何消除此错误并继续处理脚本.我会尝试将文件拆分成单独的文件,但由于我不知道这将如何影响BeautifulSoup以及XML数据,我宁愿不这样做.

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

Mar*_*ers 15

千万不能使用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()
Run Code Online (Sandbox Code Playgroud)

通过使用事件驱动的方法,您永远不需要将整个 XML文档保存在内存中,只需提取所需内容并丢弃其余内容.

请参阅iterparse()教程和文档.

或者,您也可以使用lxml库 ; 它在更快,更功能的包中提供相同的API.