本記事は、京都大学人工知能研究会KaiRAのAdvent Calender 6日目の記事です。
皆さんはPythonでOut Of Memoryで苦労したことはありませんか?
当然ながら私もOut Of Memoryに悩まされることがありまして、その度に何かOut Of Memoryを回避する良い方法がないかなと思っていました。
C++ではスコープを抜けたら勝手に変数のメモリ解放を行ってくれるので、こまめにスコープを波括弧を使ってやるとこまめにメモリ解放を簡単に行うことができるのですが、Pythonでは検索してもなかなか良さそうな方法が見つからず…
今回は、jupyter notebookでOut Of Memory対策に使える便利なマジックコマンドについて紹介したいと思います!
検索したら良く見かける方法
検索してよく見かけるのは明示的に変数を削除する以下の方法です。
import gc
a = [0, 1, 2]
del a
gc.collect()
この方法を使うとメモリを解放してくれます。
ただ、この方法に前からずっと不満がありました。
不満というのは変数を明示的に削除しないといけない点です。
このようなコードだと、新しい変数を作ったときに削除し忘れたりとか、変数を無くした時にdelのところから消し忘れたりすることがあります。
機械学習だと$5$分、$10$分、場合によっては$30$分や$1$時間ぐらい無駄にしてしまってイライラすることになるわけですね。
今回初めて知った方法
Kaggleでチームを組んだ方がOut Of Memory対策に使える便利なマジックコマンドを教えてくださいました。
本当にありがとうございます。
それは以下のようなものです。
%%python
a = [0, 1, 2]
%%pythonをセルの最初に付け加えるだけです。
簡単ですね。
こうすると、このセルを抜けたときに変数を全部勝手に解放してくれます。
ただし、注意点があって、このセルの外でimportしたモジュールやこのセルの外で定義した変数は、このセルの中では使えません。
この%%pythonというマジックコマンドは、セルを一つのPythonプログラムとして「完結」させてしまうようなマジックコマンドなわけですね。
まとめ
delやgcを使ってメモリを解放することもできますが、Jupyter Notebookであればセルの先頭に%%pythonと書いておけばそのセルが終わったところでメモリを解放してくれます。
最後まで読んでくださり、ありがとうございました!