10

Python スクリプトを使用して大規模なsolrクエリを発行しているときに、メモリの問題が発生しています。solrpyライブラリを使用して、solr サーバーとやり取りしています。クエリは、約 80,000 レコードを返します。クエリを発行した直後に、上部のバルーンから見た Python のメモリ フットプリントは最大 190 MB です。

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
8225 root      16   0  193m 189m 3272 S  0.0 11.2   0:11.31 python
...

この時点で、heapy から見たヒープ プロファイルは次のようになります。

Partition of a set of 163934 objects. Total size = 14157888 bytes.   
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  80472  49  7401384  52   7401384  52 unicode
     1  44923  27  3315928  23  10717312  76 str
...

Unicode オブジェクトは、クエリからのレコードの一意の識別子を表します。注意すべきことの 1 つは、Python が 190MB の物理メモリを占有しているのに対し、合計ヒープ サイズはわずか 14MB であることです。クエリ結果を格納する変数が範囲外になると、ヒープ プロファイルはガベージ コレクションを正しく反映します。

Partition of a set of 83586 objects. Total size = 6437744 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  44928  54  3316108  52   3316108  52 str

ただし、メモリ フットプリントは変更されません。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 8225 root      16   0  195m 192m 3432 S  0.0 11.3   0:13.46 python
...

Python の物理メモリ フットプリントと Python ヒープのサイズに大きな違いがあるのはなぜですか?

4

4 に答える 4

5

Python は C ヒープから Unicode オブジェクトを割り当てます。したがって、それらの多くを (他の malloc ブロックと一緒に) 割り当ててから、最後のブロックを除いてほとんどのブロックを解放すると、C のヒープは最後にしか縮小されないため、C の malloc はオペレーティング システムにメモリを返しません (真ん中ではない)。最後の Unicode オブジェクトを解放すると、C ヒープの最後でブロックが解放され、malloc がそのすべてをシステムに返すことができます。

これらの問題に加えて、Python は割り当てを高速化するために、解放された Unicode オブジェクトのプールも維持します。そのため、最後の Unicode オブジェクトが解放されても、すぐに malloc に戻されず、他のすべてのページが動かなくなります。

于 2009-07-28T14:36:47.670 に答える
2

CPythonの実装は、割り当てられたメモリを例外的に解放するだけです。これは広く知られているバグですが、CPython開発者はあまり注目していません。推奨される回避策は、大量のRAMを消費するプロセスを「フォークアンドダイ」することです。

于 2009-07-28T17:06:03.303 に答える
1

どのバージョンの python を使用していますか? 古いバージョンの CPython ではメモリが解放されず、Python 2.5 で修正された
ため、質問しています。

于 2009-07-28T14:41:07.883 に答える
0

hruske の「フォーク アンド ダイ」というアドバイスを実装しました。私は os.fork() を使用して、メモリを集中的に使用するコードのセクションを子プロセスで実行してから、子プロセスを終了させます。親プロセスは子プロセスで os.waitpid() を実行し、一度に 1 つのスレッドのみが実行されるようにします。

このソリューションに落とし穴がある場合は、ご連絡ください。

于 2009-07-28T19:35:36.467 に答える