106

重複の可能性:
大きなJSONファイルをロードするためのメモリ効率が高く高速な方法はありますか?

だから私はいくつかのかなり大きなjsonエンコードファイルを持っています。最小は300MBですが、これははるかに小さいです。残りは複数GBで、約2GBから10GB以上です。

そのため、Pythonでファイルを読み込もうとすると、メモリが不足しているようです。私は現在、いくつかのテストを実行して、このようなものを処理するのにどれくらいの時間がかかるかを確認して、ここからどこに行くのかを確認しています。テストに使用しているコードは次のとおりです。

from datetime import datetime
import json

print datetime.now()

f = open('file.json', 'r')
json.load(f)
f.close()

print datetime.now()

当然のことながら、Pythonは私にMemoryErrorを与えます。json.load()がjson.loads(f.read())を呼び出しているようです。これは、最初にファイル全体をメモリにダンプしようとしますが、これは明らかに機能しません。

これをきれいに解決できる方法はありますか?

これは古いことは知っていますが、重複しているとは思いません。答えは同じですが、質問は異なります。「複製」では、大きなファイルを効率的に読み取る方法が問題になりますが、この質問は、メモリにまったく収まらないファイルを扱います。効率は必要ありません。

4

1 に答える 1

108

ここでの問題は、フォーマットとしてのJSONは通常、完全に解析されてからメモリ内で処理されることです。これは、このような大量のデータでは明らかに問題があります。

これに対する解決策は、データをストリームとして処理することです。ファイルの一部を読み取り、それを処理してから、繰り返します。

最良のオプションは、 ijsonのようなものを使用しているようです-ブロックファイルとしてではなく、ストリームとしてJSONを処理するモジュールです。

編集:また一見の価値があります-についてのkashifのコメントとについてjson-streamerHenrikHeinoのコメントbigjson

于 2012-04-30T10:44:52.900 に答える