7

これに似た質問をたくさん見ましたが、実際に一致するものはありませんでした。他のほとんどの質問は速度に関係しているようでした。私が経験しているのは、ローカルボックスの1.1gigファイルにある単一のjson辞書で、次の行に沿って何かを使用してロードしようとすると、16ギガバイトのメモリをすべて消費します。

f = open(some_file, "rb")
new_dictionary = json.load(f)

これは、使用しているjsonライブラリ(ujson、json、yajlを試しました)に関係なく、またバイトストリームとして読み込むかどうかに関係なく発生します。これは私にはまったく意味がありません。クレイジーなメモリ使用量とは何ですか?どうすればそれを回避できますか?

それが役立つ場合、辞書はネストされた辞書の集まりであり、すべてのintが他のintを指します。サンプルは次のようになります。

{"0":{"3":82,"4":503,"15":456},"956":{"56":823,"678":50673,"35":1232}...}

更新:これをsimplejsonで実行すると、実際には8ギガしかかかりません。なぜそれが他のすべてよりもはるかに少ないのか分かりません。

更新2:それで私はもう少し調査をしました。私は辞書にsimplejsonをロードし、すべてのキーをintに変換してみました(文字列がより多くのスペースを占める可能性があるというLioriの提案による)。スペースは8ギグで同じままでした。次に、gc.collect()を実行するというWinstonEwertの提案を試しました。スペースはまだ8ギガのままでした。最後に、イライラして好奇心をそそられ、新しいデータ構造を選択し、Pythonを終了して、リロードしました。見よ、それでも8ギガかかる。Pythonは、大きな2D辞書用にそれだけのスペースが必要だと思います。確かにイライラしますが、少なくとも今では、simplejsonを使用してロードする限り、JSONの問題ではないことがわかります。

4

4 に答える 4

3

ストリーミングAPIを試すことができます。

http://lloyd.github.com/yajl/

そのうちのいくつかのPythonラッパーがあります。

https://github.com/rtyler/py-yajl/

https://github.com/pykler/yajl-py

于 2012-05-05T09:49:30.517 に答える
2

gc.collect()私の側での少しの実験は、jsonオブジェクトが解析された後に呼び出すと、オブジェクトが最初に構築されたときのメモリ使用量が低下することを示唆しています。

小規模なメモリ使用量で得られる結果は次のとおりです。

Build. No GC
762912
Build. GC
763000
Standard Json. Unicode Keys. No GC
885216
Standard Json. Unicode Keys. GC
744552
Standard Json. Int Keys. No GC
885216
Standard Json. Int Keys. GC
744724
Simple Json. Unicode Keys. No GC
894352
Simple Json. Unicode Keys. GC
745520
Simple Json. Int Keys. No GC
894352
Simple Json. Int Keys. GC
744884

基本的に、gc.collect()を実行すると、JSON解析プロセス中に生成されるある種のガベージがクリーンアップされるように見えます。

于 2012-05-05T00:55:10.230 に答える
0

Gabeはコメントでこれを本当に理解しましたが、数か月経ち、彼はそれを回答として投稿していないので、私は自分の質問に答えるだけでよいと考えました。

とにかく、答えは、2D辞書がPythonでそれだけのスペースを占めるということです。それらの辞書のそれぞれは、いくらかのスペースオーバーヘッドで終わります、そしてそれらがたくさんあるので、それは1.1ギガから8ギガに膨らみます、そしてそれについてあなたができることは別のデータ構造を使うかもっと得ることを試みる以外に何もありませんRAM。

于 2012-08-23T18:25:03.970 に答える
0

私がこれを言おうとしているとは信じられませんが、jsonは実際には非常に単純な形式であり、独自のパーサーを構築することはそれほど難しくありません。

そうは言っても、それは次の場合にのみ意味があります。

  • 最後に完全な辞書は必要ありません(つまり、データを読みながら消費することができます)
  • データがどのような構造になっているのかがわかります(任意の深さの辞書を使用すると、これがはるかに困難になります)
于 2012-05-05T00:01:58.363 に答える