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

2024-04-27 05:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件数据inreadsize错误codeerror
1条回答
网友
1楼 · 发布于 2024-04-27 05:43:53

不要使用BeautifulSoup来尝试这么大的解析XML文件。改用ElementTree API。具体来说,使用^{} function将文件解析为流,在收到元素通知时处理信息,然后再次删除元素:

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

请参阅^{} tutorial and documentation

或者,您也可以使用lxml library;它在一个更快、功能更丰富的包中提供相同的API。

相关问题 更多 >