6

私は、メモリを割り当てる非常に単純なスクリプトを持っています。delsこれは、サイズの大きいオブジェクトへの唯一の参照であり、印刷heapypidstatレポートの作成中です。スクリプトを実行した後、heapy はメモリをあまり使用しないように指示しますが、pidstat は反対のことを伝えます。

from guppy import hpy
import time
import sys
import os

'''
1) print heapy and pidstat report after starting and before actually doing any work
2) allocate some memory in a simple 2d array
3) print heapy and pidstat report
4) del the d2 array (attempt at garbage collection)
5) print heapy and pidstat report
6) sleep so pidstat can continue to be run to check on memory
'''

def pidstat(msg):
    print '==============================='
    print msg
    os.system('pidstat -r -p %s' % os.getpid())
    print '+++++++++++++++++++++++++++++++'
    print hpy().heap()[0]
    print '==============================='

pidstat('before doing anything')
docs = []
for doc in range(0, 10000):
    docs.append([j for j in range(0, 1000)])

pidstat('after fetching all the docs into memory')
del docs

pidstat('after freeing the docs')
time.sleep(60)

出力は次のようになります。

===============================
何かをする前に
Linux 2.6.38-15-generic (hersheezy) 2012 年 8 月 14 日 _x86_64_ (4 CPU)

01:05:20 PM PID minflt/s majflt/s VSZ RSS %MEM コマンド
01:05:20 PM 5360 0.44 0.00 44768 9180 0.11 パイソン
+++++++++++++++++++++++++++++++++
19760 個のオブジェクトのセットのパーティション。合計サイズ = 1591024 バイト。
 インデックス カウント % サイズ % 累積 % 種類 (クラス / クラスの辞書)
     0 19760 100 1591024 100 1591024 100 スト
===============================
===============================
すべてのドキュメントをメモリにフェッチした後
Linux 2.6.38-15-generic (hersheezy) 2012 年 8 月 14 日 _x86_64_ (4 CPU)

01:05:21 PM PID minflt/s majflt/s VSZ RSS %MEM コマンド
01:05:21 PM 5360 8.95 0.00 318656 279120 3.49 パイソン
+++++++++++++++++++++++++++++++++
7431665 個のオブジェクトのセットのパーティション。合計サイズ = 178359960 バイト。
 インデックス カウント % サイズ % 累積 % 種類 (クラス / クラスの辞書)
     0 7431665 100 178359960 100 178359960 100 整数
===============================
===============================
ドキュメントを解放した後
Linux 2.6.38-15-generic (hersheezy) 2012 年 8 月 14 日 _x86_64_ (4 CPU)

01:05:29 PM PID minflt/s majflt/s VSZ RSS %MEM コマンド
01:05:29 PM 5360 40.23 0.00 499984 460480 5.77 パイソン
+++++++++++++++++++++++++++++++++
19599 個のオブジェクトのセットのパーティション。合計サイズ = 1582016 バイト。
 インデックス カウント % サイズ % 累積 % 種類 (クラス / クラスの辞書)
     0 19599 100 1582016 100 1582016 100 文字
===============================

このメモリがオペレーティング システムに返されることを確認するにはどうすればよいですか?

4

2 に答える 2

3

pythonメモリがプロセス内で再利用できるようになるタイミングと、OS に解放されるタイミングには違いがある場合があります。特に、標準の Python インタープリター (CPython) は、特定の種類のオブジェクトに対して独自のプールと空きリストを保持しています。これらのプール自体でメモリを再利用しますが、一度使用すると OS に解放することはありません。

詳しくはこちらをご覧ください。

于 2012-08-14T17:29:12.063 に答える
1

このメモリがオペレーティング システムに返されることを確認するにはどうすればよいですか?

一般的にはそうではありません。Python は「アリーナ」にメモリを割り当て、インタープリターで参照が削除された場合でも、後で使用するためにそのメモリ アリーナを保持します。新しいバージョンの python には、アリーナが完全に空の場合にアリーナを解放するメカニズムがあると思います。ただし、オブジェクトが配置される場所を制御することはできません。

于 2012-08-14T17:28:58.210 に答える