未完放流

終わりなど無い、有るのは試練だけだ……

RStudio で大き過ぎるオブジェクトを View しない方が良いかもしれない

RStudio 便利ですよね。 普段はできるだけCLIを使い "Small is beatuiful." を実践しているつもりですが、R を使う時は RStudio を使ってしまいます。 逆に CLI から R を使うのはシステムにパッケージを入れるときぐらいですかね。

さて最近、RStudio 比較的大きなデータを使った際のトラブルを紹介します。

私の試した環境は以下の通りになります。 今回の現象は Windows 及び Mac では確認しておりません。

検証

起動直後の状態をシステム・モニタのメモリから転載、 環境・タイミングによって多少違います。

起動直後
R (CLI) 36.0 MiB
RStudio + rsession 254.0 + 77.7 MiB

以下のようなコマンドを用意します。n に任意の数をいれることで、n * n の行列を作っています。

n <- 2; a <- matrix(runif(n*n), nrow = n, ncol = n)

R のメモリ管理など詳細は分かりませんが、n 比例して R, rsession 増えます。 n = 1000 ならば、size (ペイン内の表示)は 7.6 Mb となります。

起動直後 行列生成後
R (CLI) 36.0 MiB 52.4 MiB
RStudio + rsession 254.0 + 77.7 MiB 254.0 + 138.7 MiB

RStudio は行列の生成と関係ないので消費量は変わりません。 一つ気になるのは生成後の rsessin が大体 50 MiB 強となり、大体生成後のRのプロセスと同程度の大きさですね。 ひょっとするとコマンドを打ち込んだ後にプロセスを生成しているのかもしれません。

さて、この状態で RStudio で以下のように打ち込むか

View(a)

右上のペインから "a" の虫眼鏡アイコンをクリックすると左上のペインで行列の中身が表示されます。

比較的小さなオブジェクトであれば気にすることなく一瞬で終わりますが、 今回のような行列の成分数が100万程度になると相応に時間がかかると思います。 私のPCではコアの使用率が100%になり数秒程度待たされます。

この時点でのメモリは RStudio は 1.1 GiB といきなり 800 MiB ほど消費します。 ちなみに rsession も多少バッファなどを用意するのか 186.5 MiB ほどになります。

起動直後 行列生成後 View 後
R (CLI) 36.0 MiB 52.4 MiB
RStudio + rsession 254.0 + 77.7 MiB 254.0 + 138.7 MiB 1.1 GiB + 186.5 MiB

R (CLI) の消費量から概算すると 1000 * 1000 程度の行列ならば 12 MiB 程度だと思いますが、 RStudio では表示するために約66倍のメモリを使っているようです。

私が試した限りでは n に比例してメモリを使うようです。 最近のPCは8GB 程度は普通に積んでいますので、この程度大きさであればそれほど問題ありません。 しかし、仮に n = 104 ならば表示するために約110 GiB ほど必要かと思われます。 実際に一度試しましたがスワッピングを起こし止まってしまいました。その後、強制終了。

:単体で 128 GiB 積んだマシンはあまりないと思いますので実行しないで下さい。実行は自己責任でお願いします。

実用上での注意

R や RStudio にはフォルダごとに前回の session を読み込む機能があります。 RStudio で大きなオブジェクトを読み込んだ状態で終了すると、次回起動時に再現します。 不要なオブジェクトは消去しておいた方が良さそうです。

以前のバージョンでは行列で言えば1000程度までしか読み込みませんでした。 現在では全て表示するように仕様変更があったようですが、大き過ぎるデータを読み込む場合は注意した方が良さそうです。

私は成分数が 107 オーダーのデータをよく取り扱います。 軽い気持ちで中身を確認しようとして View 機能を使うと結構痛い目に会います。 みなさんもお気をつけ下さい。