2012-07-26 7 views
6

次のような現象が見られました。私は、次の多次元配列を作成言う:Rの予約メモリは、割り当てられた配列の2倍です。

spam = array(runif(96*48*60*360), dim = c(96,48,60,360)) 

それは多くのメモリをR、すなわち、このために使用する方法を非常に予測可能である(96 * 48 * 60 * 360)* 4バイト= 759.4バイト。プロセスは、しかし、多くのメモリを使用して、約2倍の大きさ

> lsos() 
     Type  Size PrettySize Rows Columns 
spam array 796262520 759.4 Mb 96  48 
lsos function  776 776 bytes NA  NA 

R:

$ top | grep rsession 
82:17628 hiemstra 20 0 1614m **1.5g** 8996 S 0.3 40.4 0:04.85 rsession 

はなぜRはこれを行うんこれはうまくlsos機能(this postを参照)を用いて確認されましたか?私は余分な予約されたメモリは、より迅速にRにアクセスできるように割り当てられていると思いますか?何かご意見は?

答えて

6

ガベージコレクタがまだ実行されていないためです。
大きな配列の作成時におそらく生成されたゴミがたくさんあり、それをクリアする必要があります。あなたがgc()関数を呼び出して、ガベージコレクションを強制する場合

、あなたが使用するメモリはかなりあなたの配列のサイズに近くなることが表示されます:

> memory.size() 
[1] 775.96 
+0

だから、最終的には、配列は759.4メガバイトを使用していますが、創造の間にそれはより多くを使用するか?配列がメモリに収まる場合は不幸なことですが、作成時のメモリ使用量の急上昇は使用可能なメモリ量を超えて使用されます。 –

+1

まあ、私はフードの中で何が起こるのか正確にはわかりませんが、あなたのコードでは単純に配列を割り当てているわけではありません。実際には、まず乱数のベクトルを生成し、その値をコピーして配列を割り当てます。だから、私はオーバーヘッド(すなわちゴミ)のほとんどがその使い捨てのベクトルに起因すると思います... – digEmAll

+0

しかし、私はガベージコレクタがメモリ不足時に自動的にトリガすると思いますので、配列がメモリに収まる限り発行します... – digEmAll

関連する問題