2009-04-14 14 views
12

オブジェクトのメモリ占有量を見積もる良い方法はありますか?Python:データ構造のメモリフットプリントを見積もる/計算する方法は?

逆に、フットプリントを測定するにはどうすればよいでしょうか?例えば

、私はその値は、整数、フロートタプルのリストである辞書を持っていると言う:

d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ] 

私は物理メモリの4Gを持っており、約どのように多くの行(キー:値)を把握したいと思います私はスワップにこぼれ落ちる前に私は記憶に格納することができます。これはlinux/ubuntu 8.04とOS X 10.5.6です。

さらに、私のプログラムの実際のメモリ内フットプリントを調べるにはどうすればよいですか?物理的な記憶と流出を疲弊しているときに、どのようにしてわかりますか?

答えて

9

Guppyは素敵なメモリプロファイラ(Heapy)を持つ:

>>> from guppy import hpy 
>>> hp = hpy() 
>>> hp.setrelheap() # ignore all existing objects 
>>> d = {} 
>>> d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ] 
>>> hp.heap() 
Partition of a set of 24 objects. Total size = 1464 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0  2 8  676 46  676 46 types.FrameType 
    1  6 25  220 15  896 61 str 
    2  6 25  184 13  1080 74 tuple 
... 

Heapyは少しunderdocumentedあるので、あなたは、Webページやソースコードを少し掘るする必要があるかもしれませんが、それは非常に強力です。また、関連性があるかもしれないarticlesもあります。

+1

なぜ 'd'に6 '文字'オブジェクトがありますか? –

+0

新しい変数をバインドすると、新しい文字列が作成されます( 'd')。属性ルックアップ(ヒープ)が別のものを占めます。私は残りがどこから来ているのか分かりません。 –

+0

実際の結果はさまざまで、使用している特定のインタプリタの実装に対してそれらをチェックするか、または分散を見つけるために試行錯誤する必要があります。たとえば、上記の例を試したところ、合計96バイトの3つの文字列が報告されました。 –

5

あなたは私の知るいくつかあり、そのうちのメモリプロファイラでこれを行うことができます。

  1. PySizer - ホームページは現在、推奨していますようpoissibly時代遅れに、:

  2. Heapyを。

これはおそらくthis質問の複製です。

関連する問題