9

ファイルをjsonにロードすると、pythonのメモリ使用量が約1.8GBに急増し、そのメモリを解放できないようです。非常に単純なテストケースをまとめました:

with open("test_file.json", 'r') as f:
    j = json.load(f)

サンプルの json ファイルを提供できなくて申し訳ありません。私のテスト ファイルには多くの機密情報が含まれていますが、文脈上、240MB 程度のファイルを扱っています。上記の 2 行を実行すると、前述の 1.8 GB のメモリが使用されます。その後、del jメモリ使用量はまったく低下しません。それを a でフォローしても、gc.collect()まだドロップしません。json モジュールをアンロードして、別の gc.collect を実行してみました。

メモリ プロファイリングを実行しようとしていますが、heapy は約 1 時間にわたって 100% の CPU を使用しており、まだ出力を生成していません。

誰にもアイデアはありますか?パッケージ化されたjsonモジュールではなく、cjsonを使用して上記も試しました。cjson は約 30% 少ないメモリを使用しましたが、それ以外はまったく同じ問題が表示されました。

Ubuntu サーバー 11.10 で Python 2.7.2 を実行しています。

メモリ プロファイラーをロードして、それがヒーピーよりも優れているかどうかを確認し、必要と思われる診断を提供できることをうれしく思います。私は、他の誰かが試してみるために提供できる大きなテスト json ファイルを探しています。

4

1 に答える 1

14

これらの2つのリンクは、これが必ずしもjsonの問題ではなく、単なる「ラージオブジェクト」の問題であり、メモリがPythonとオペレーティングシステムでどのように機能するかについてのいくつかの興味深い点に対応していると思います。

大きなオブジェクトを削除すると、Pythonがメモリを解放しないのはなぜですか?を参照してください。Pythonから解放されたメモリが必ずしもオペレーティングシステムに反映されない理由は次のとおりです。

大きなオブジェクトを作成して再度削除すると、Pythonがメモリを解放した可能性がありますが、関連するメモリアロケータは必ずしもメモリをオペレーティングシステムに返すとは限らないため、Pythonプロセスがより多くの仮想メモリを使用しているように見える場合があります実際に使用するよりも。

サブプロセスでラージオブジェクトプロセスを実行して、OSにクリーンアップを処理させる方法について:

メモリの大規模で一時的な使用が完了時にすべてのリソースをシステムに返すことを保証する唯一の本当に信頼できる方法は、その使用をサブプロセスで行わせることです。サブプロセスは、メモリを大量に消費する作業を実行して終了します。このような状況では、オペレーティングシステムがその役割を果たし、サブプロセスが飲み込んだ可能性のあるすべてのリソースを喜んでリサイクルします。幸いなことに、マルチプロセッシングモジュールを使用すると、この種の操作(以前はかなり面倒でした)がPythonの最新バージョンではそれほど悪くありません。

于 2012-06-15T20:53:08.763 に答える