メモリ食ってる変数を確認・削除したい
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)),'|'))
出力結果は以下のような感じになる。
![スクリーンショット 2017-01-03 17.34.11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F88804%2Fd2b7658e-b602-e74f-8bf5-658994371796.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=928657a186c45b86af6a1d4364fe4f3d)
しかしこのコマンドだと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)),'|'))
すると、
![スクリーンショット 2017-01-03 17.39.00.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F88804%2Fa182645c-6585-c058-8686-93bc059def11.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c538445cf5d2795791819572a3e3041c)
この通り、メモリ容量が大きい変数だけを抽出することが出来る。
ここまで出来たらあとは、
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