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 ヒープのサイズに大きな違いがあるのはなぜですか?