Python でオブジェクトによって使用されているメモリの量を確認する [重複]

StackOverflow https://stackoverflow.com/questions/33978

質問

この質問にはすでに答えがあります:

オブジェクトによって使用されているメモリの量を調べるにはどうすればよいでしょうか?コードのブロックによって使用されている量を確認することは可能ですが、インスタンス化されたオブジェクト(存続期間中はいつでも)によっては確認できないことはわかっています。これが私が望むことです。

役に立ちましたか?

解決

Python オブジェクトのメモリ サイズを調べる簡単な方法はありません. 。あなたが見つける可能性のある問題の 1 つは、リストや辞書などの Python オブジェクトが他の Python オブジェクトへの参照を持っている可能性があることです (この場合、サイズはどれくらいになりますか?)各オブジェクトのサイズを含むサイズかどうか)。オブジェクト タイプとガベージ コレクションに関連するポインターのオーバーヘッドと内部構造がいくつかあります。最後に、一部の Python オブジェクトには、明らかではない動作があります。たとえば、リストは、ほとんどの場合、リストが持つ以上のオブジェクト用のスペースを予約します。dict はさまざまな方法で動作できるため、さらに複雑になります (少数のキーに対して異なる実装があり、場合によってはエントリを過剰に割り当てます)。

があります 大きなコードの塊 (と 大きなコード部分が更新されました) メモリ内の Python オブジェクトのサイズを最も正確に近似するために使用されます。

いくつかチェックしてみるのもいいかもしれません PyObject に関する古い説明 (事実上すべての Python オブジェクトを表す内部 C 構造体)。

他のヒント

これを試して:

sys.getsizeof(object)

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

再帰的なレシピ

別のアプローチは、ピクルスを使用することです。見る この答え この質問の複製に。

私は次のいずれについても個人的な経験はありませんが、「Python [メモリ] プロファイラー」で簡単に検索すると次のような結果が得られます。

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

  • Heapy、「Python プログラムのメモリ関連の問題に関するデバッグと最適化をサポート」 (次の場所にあります) http://guppy-pe.sourceforge.net/#Heapy.

それが役立つことを願っています。

オブジェクト __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>

大きなオブジェクトの場合は、やや大雑把ではあるが効果的な方法を使用できます。Python プロセスがシステム内でどれだけのメモリを占有しているかを確認し、オブジェクトを削除して比較してください。

この方法には多くの欠点がありますが、非常に大きなオブジェクトの場合は非常に高速に推定できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top