web-dev-qa-db-ja.com

ipythonおよびjupyterのメモリ使用量をリストする

Ipythonカーネルが使用するメモリは数個(ほぼ10個)です。これは、何らかの操作中に生成した可能性のある大きなオブジェクト(行列、リスト、numpy配列など)から来ていると思うので、もう必要ありません。

定義したすべてのオブジェクトを一覧表示するおよび並べ替えるをメモリフットプリントで表示したいと思います。それを行う簡単な方法はありますか?特定のタイプにはnbytesメソッドがありますが、すべてではありません...そのため、作成したすべてのオブジェクトとそのメモリ占有をリストする一般的な方法を探しています。

28
Rho Phi

ipythonまたはjupyterを使用していると仮定すると、すべてのオブジェクトのリストを取得するには少し作業が必要になりますyou定義済み。つまり、globals()で使用可能なすべてのものを取得し、modulesbuiltinsipython objectsなどのオブジェクトを除外します。これらのオブジェクトを確認したら、その後、sys.getsizeofでサイズを取得することができます。これは次のように要約できます。

import sys

# These are the usual ipython objects, including this one you are creating
ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars']

# Get a sorted list of the objects and their sizes
sorted([(x, sys.getsizeof(globals().get(x))) for x in dir() if not x.startswith('_') and x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True)

pythonオブジェクト(pythonの組み込み関数で作成されたもの)の場合、sys.getsizeofは非常に正確ですが、サードパーティを使用して作成されたオブジェクトでは少し不正確になる可能性があります。さらに、オブジェクトがガベージコレクターによって管理されている場合、sys.getsizeofがガベージコレクターのオーバーヘッドを追加することに注意してください。

補足として、numpy.nbytesメソッドは、配列オブジェクトの非要素属性によって消費されるメモリを含まないという点で、多少誤解を招く可能性があります。

これがお役に立てば幸いです。

43
Abdou