R でメモリをクリア

Gustavo du Mortier 2021年2月12日
R でメモリをクリア

R スクリプトをしばらく使っていると、R 環境が多くのメモリ内データをため込んでしまい、コンピュータのリソースのかなりの部分を保留してしまうことがあります。このような状況になると、R システムはこれ以上メモリを割り当てられないためにコードの実行を拒否してしまうことがあります。R 環境を再起動してもメモリが解放されないこともあります。

コマンド rm(list=ls()) は、すべてのオブジェクトが使用しているメモリを解放することを期待していますが、実際には使用しているメモリチャンクへのポインタを破棄します。問題は、これらのメモリチャンクがすぐに解放されて新しいタスクが使えるようになるわけではないということです。

gc 関数を用いた R のメモリクリア

ガベージコレクション処理は R 内で自動的に定期的に実行されますが、ビッグデータ処理のために大量のメモリが必要なときには実行されないこともあります。このような状況では、R のメモリをクリアするために gc() 関数を呼び出すと便利です。

gc() の主な目的は、メモリ使用量に関するレポートを表示することです。副作用として、gc() を呼び出すとガベージコレクション処理が開始され、メモリがクリアされています。したがって、gc ドキュメントにあるように、ラージオブジェクトが削除された後に gc() を呼び出すことをお勧めします。

ループ内に gc() の呼び出しを挿入して、ガベージコレクションプロセスを繰り返し実行することもできます。ただ、この処理には 1 回の呼び出しにつき 100ms オーダーの時間がかかることを考慮に入れてください。したがって、反復性の高いループや反復回数の多いループ内に配置することはお勧めしません。

Windows を利用している場合は、memory.size() 関数を max=T パラメータで呼び出してオペレーティングシステムがアクセス可能なメモリ量を表示したり、max=F パラメータで任意の時点で使用されているメモリ量を表示したりすることができます。R ドキュメントでは、memory.size() 関数の他の側面について説明しています。

ビッグデータオブジェクトを作成したり破棄したりするときにメモリ消費量がどのように変化するかを示すために、以下のコードを Windows で実行してみましょう。各命令の間に max=F パラメータを指定して memory.size 関数を実行することで、メモリの使用量を確認することができます。

memory.size (max = F)

出力:

[1] 32.6

この 32.6MB が R が使用する最小のメモリ量です。

my_data <- sample (1:100000)
memory.size (max = F)

出力:

[1] 33.75

memory.size 関数で報告された使用メモリが 1 増加しているので、作成されたサンプルデータは約 1MB のメモリを消費していることがわかる。

rm (my_data)
memory.size (max = F)

出力:

[1] 33.75

オブジェクトを削除したにもかかわらず、まだメモリを占有しているようです。

gc()

出力:

         used (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells 315785 16.9     617200  33.0    617200  33.0
Vcells 633077  4.9   25730861 196.4 110503932 843.1
memory.size (max = F)

出力:

[1] 32.6

メモリの量はコンピュータによって異なると思いますが、memory.size で報告される空きメモリ量は rm (my_data) 命令を実行しても変わらず、gc() 命令を実行してメモリが実質的に解放された後は初期値の 32.6MB にしか戻っていないことがわかります。