メモリ食ってる変数を確認・削除したい
Jupyter(IPython)上でデータ解析などを行っていると、データがメモリ上にどんどん蓄積されていくので、メモリを食っている変数を確認したくなる。
そのような時に以下のコマンドを実行すると、変数とその変数のメモリ容量を一覧にして表示してくれる。
Python2
import sys
print "{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|')
print " ------------------------------------ "
for var_name in dir():
if not var_name.startswith("_"):
print "{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|')
Python3
import sys
print("{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|'))
print(" ------------------------------------ ")
for var_name in dir():
if not var_name.startswith("_"):
print("{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|'))
出力結果は以下のような感じになる。
* * *
しかしこのコマンドだとJupyter上で定義している全ての変数の結果が出力されてしまうので、例えば「メモリ容量がある一定の値以上の変数だけを取り出してほしい」と思ったら以下のようにアレンジする。
Python2
import sys
print "{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|')
print " ------------------------------------ "
for var_name in dir():
if not var_name.startswith("_") and sys.getsizeof(eval(var_name)) > 10000: #ここだけアレンジ
print "{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|')
Python3
import sys
print("{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|'))
print(" ------------------------------------ ")
for var_name in dir():
if not var_name.startswith("_") and sys.getsizeof(eval(var_name)) > 10000: #ここだけアレンジ
print("{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|'))
すると、
この通り、メモリ容量が大きい変数だけを抽出することが出来る。
ここまで出来たらあとは、
del U_Global, V_Global
のように、いらない変数を指定して削除していったらいい。
メモリを開放して、快適にJupyter(IPython)上で解析を継続することが出来る。
備考
タイトルでは「Jupyter(IPython)上で」と銘打っていますが、他のインターフェースでも恐らく同じように表示してくれるかと思います。
ただし、str.format()を使用しているため、正しく出力されるにはPython2.6以上である必要があります。
参考URL
- http://docs.python.jp/2/library/sys.html
- http://qiita.com/Kodaira_/items/30c84806b61792b613f2
- http://stackoverflow.com/questions/33978/find-out-how-much-memory-is-being-used-by-an-object-in-python
- http://stackoverflow.com/questions/633127/viewing-all-defined-variables
- http://stackoverflow.com/questions/9989334/create-nice-column-output-in-python