まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

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回だけでも消えてるような。。。)。

知っているといつか役に立つ(?)関数達 - RjpWiki

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.

参考

Rでメモリを解放する - コードログ

ガベージコレクションはこうすれば理解できる - Qiita

0093 Weblog: Rでメモリが足りなくて大変だよ!助けてドラえもん!