Rでメモリを解放したい
デカイオブジェクトを何個も作る場合、メモリが足りなくなる。それゆえに、使わなくなったら削除してメモリを空けたい。
ただ、Rではどうやらメモリを食っているオブジェクトを削除するだけではメモリが空かないみたい(Rに限った話なのかは不明)。
以下は現在の使用メモリ量をみる。
15GB使っている模様。
>top -l 1 -s 0 | grep PhysMem PhysMem: 15G used (3186M wired), 17G unused.
なんかデカイオブジェクト作る。どうやら4.5GBなようだ。
tmp = matrix(rnorm(6e5*1000),6e5,1000) print(object.size(tmp), units = "auto") # => 4.5 Gb
再度、現在の使用メモリ量を見る。
>top -l 1 -s 0 | grep PhysMem PhysMem: 24G used (3192M wired), 8209M unused.
よくわからんが、先程作成したオブジェクトの4.5GB分ではなく、9GB分増えてる。想定より多いのはなんでかよくわからんが、とりあえず増えてるからこのまま進める。
先程作成した4.5GBのオブジェクトを削除する。
rm(tmp);
>top -l 1 -s 0 | grep PhysMem PhysMem: 24G used (3192M wired), 8209M unused.
オブジェクトを削除しても使用メモリ容量は変わってない。
ガーベージコレクションをしたら消えるみたい。おそらく、オブジェクト自体は削除されたけど、メモリが確保されたままなので強制解放をするってことなんかな。
ちなみに、2回連続でgc()
しているのは以下を参考にしているからです(ただ1回だけでも消えてるような。。。)。
gc(reset = TRUE) gc(reset = TRUE) # gc(reset = TRUE) # used (Mb) gc trigger (Mb) limit (Mb) max used (Mb) # Ncells 1315929 70.3 2022381 108.1 NA 1315929 70.3 # Vcells 80286010 612.6 1806746712 13784.4 32768 80286010 612.6
>top -l 1 -s 0 | grep PhysMem PhysMem: 11G used (3173M wired), 21G unused.
はじめに書いた、巨大オブジェクト作成前の使用容量15GBより使用容量減ってるんですけど!tmp
オブジェクト以外でも無駄に確保してたメモリも解放されたのか?
念の為、tmp
オブジェクトを削除せずガーベージコレクションしたものと、その後にtmp
オブジェクトを削除してからガーベージコレクションしたものの差分をみる。
tmp
オブジェクトを削除せずガーベージコレクションすると15GB使用。
tmp = matrix(rnorm(6e5*1000),6e5,1000) gc(reset = TRUE);gc(reset = TRUE);
>top -l 1 -s 0 | grep PhysMem PhysMem: 15G used (3162M wired), 17G unused.
その後、tmp
オブジェクトを削除してからガーベージコレクションすると11GB使用で、差分4GBなのでtmp
オブジェクト分がおそらく浮いた模様。
rm(tmp); gc(reset = TRUE);gc(reset = TRUE);
>top -l 1 -s 0 | grep PhysMem PhysMem: 11G used (3163M wired), 21G unused.