13

私は非常に大きな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からのデータベースダンプであり、多くのページからの直接情報を使用して、さまざまな期間のデータをインポートするために使用します)

4

1 に答える 1

21

BeautifulSoupを使用して、このような大きな解析XMLファイルを試してはいけません。代わりにElementTreeAPIを使用してください。具体的には、この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を提供します。

于 2013-02-17T18:18:13.670 に答える