2008-08-29 14 views
143

オブジェクトによってどれだけのメモリが使用されているかを調べるにはどうすればよいですか?どのように多くのコードが使用されているかを知ることは可能ですが、インスタンス化されたオブジェクト(その生涯のいつでも)ではなく、私が望むものです。Pythonのオブジェクトで使用されているメモリの量を確認してください

+0

類似:http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –

+0

objgraphは面白そうです:http://mg.pov .lt/objgraph/ –

+0

グラフィカルテスト:http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt

答えて

81

pythonオブジェクトのメモリサイズを簡単に見つける方法はありません。あなたが見つけるかもしれない問題の1つは、リストや辞書のようなPythonオブジェクトが他のPythonオブジェクトへの参照を持つかもしれないということです(この場合、あなたのサイズは何ですか?オブジェクト型やガベージコレクションに関連するいくつかのポインタオーバーヘッドと内部構造があります。最後に、いくつかのPythonオブジェクトには、明白でない振る舞いがあります。例えば、リストは、ほとんどの場合、それより多くのオブジェクトのためのスペースを確保します。 dictsはいろいろな方法で動作することができます(少数のキーに対しては異なる実装を持ち、時にはエントリを割り当てすぎることもあります)。

メモリ内のPythonオブジェクトのサイズを最も近似するために、big chunk of code(およびupdated big chunk of code)があります。また、simpler approximationsもあります。しかし、それらは常に近似値になります。

old description about PyObject(事実上すべてのpythonオブジェクトを表す内部構造体)を確認することもできます。

+6

@culix:[Pympler](http://pythonhosted.org/Pympler/)で再び使用されているようですモジュール。 – FriendFX

+0

「より単純な近似」リンクが壊れています - あなたは[このメッセージ](https://mail.python.org/pipermail/python-list/2008-January/510696.html)にリンクしましたか? – Air

+0

あなたのオブジェクトが 'Int - >(Int、Int)'マッピングを持つdictのようにかなりシンプルな場合はどうなりますか?理論的には、そのようなオブジェクトのサイズを計算するのは簡単ですね。 –

4

は、私は以下のいずれかではない任意の個人的な経験を持っていますが、「Pythonの[メモリ]プロファイラー」利回りのためのシンプルな検索:

  • PySizer、「Python用のメモリプロファイラは、」見つかりましたhttp://pysizer.8325.org/。しかし、このページはプロジェクトがしばらく更新されていないことを示しているようです...

  • Heapy、 "Pythonプログラムのメモリ関連の問題に関するデバッグと最適化をサポートしています" http://guppy-pe.sourceforge.net/#Heapy

希望します。

23

もう1つのアプローチは、ピクルスを使用することです。この質問の複製にはthis answerを参照してください。

+3

これは非常に賢明で簡単なアプローチです。 –

+0

私は本当にあなたの答えに興味がありますが、あなたの答えが指しているリンクにアクセスすることはできません... –

+0

@YohanObadia私はちょうどリンクを試して、それは働いた...それはもう一つの答えです。 – drevicko

63

これを試してみてください:

sys.getsizeof(object) 

getsizeof()は、オブジェクトの__sizeof__メソッドを呼び出して、オブジェクトがガベージコレクタによって管理されている場合は、追加のガベージコレクタのオーバーヘッドを追加します。

A recursive recipe

+2

このsys.getsizeof(オブジェクト)の戻り値には、上記のfserbのポインタのサイズではなく、実際のオブジェクトのサイズが含まれていますか? –

+2

いいえ、ポインタのサイズを返します。 – lstyls

2

これは誤解を招くかもしれません__sizeof__オブジェクトにオーバーライドするので注意して使用する必要があります。

bregman.suiteを使用すると、sys.getsizeofを使ったいくつかのテストでは、オブジェクトインスタンスの配列オブジェクト(データ)のコピーがオブジェクト自体(mfcc)より大きいものとして出力されます。あなたは多少の粗だが効果的な方法を使用することができ、大きなオブジェクトの場合

>>> mfcc = MelFrequencyCepstrum(filepath, params) 
>>> data = mfcc.X[:] 
>>> sys.getsizeof(mfcc) 
64 
>>> sys.getsizeof(mfcc.X) 
>>>80 
>>> sys.getsizeof(data) 
80 
>>> mfcc 
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90> 
-2

:あなたのPythonのプロセスは、システムに占有しているどのくらいのメモリ チェックし、オブジェクトを削除して比較します。

この方法には多くの欠点がありますが、非常に大きなオブジェクトの見積もりが非常に速くなります。

+3

これは効果がない可能性があります。プロセスで解放されたメモリをオペレーティングシステムに戻す必要はないため、メモリ使用量の減少を正確に予測できない場合があります。 –

+7

オブジェクトが作成される前と、後でPythonプロセスリソースの使用量を測定する同様のアプローチは非常に効果的です。 –

+1

@AntonyHatchkinsはpythonメモリマネージャーではありませんので、必ずしもオペレーティングシステムから新しいメモリを取得するとは限りません。メモリプールは、使用されていなくても割り当てられているので、新しい要求がある場合、オペレーティングシステムからさらに多くのメモリを要求する必要はありません。 つまり、この方法はオブジェクトの作成と破棄の両方で信頼性がありません。 – spider

関連する問題