2012-07-26 89 views
6

我發現了以下行爲。說我創建以下多維數組:R的預留內存是分配數組大小的兩倍

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

這是相當可預測的多內存r應該如何使用這一點,即(96 * 48 * 60 * 360)* 4個字節= 759.4兆字節。這是使用lsos功能很好的證實(見this post):

> 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請勿呢?我假設分配額外的保留內存以使其更快地被R訪問?有什麼想法嗎?

回答

6

因爲垃圾收集器尚未運行。
所以有很多垃圾,可能在創建大數組時產生,必須清除。

如果強制垃圾收集致電gc()功能,您將看到使用的內存將是非常接近你的數組的大小:

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

所以在陣列使用759.4兆字節結束,但在創作過程中它使用更多?如果陣列適合內存,這可能是不幸的,但是在創建過程中內存使用率的高峯使用超過可用內存量。 – 2012-07-26 08:44:59

+1

嗯,我不知道到底發生了什麼,但是用你的代碼你不是簡單地分配一個數組;實際上,首先生成一個隨機數的向量,然後通過複製該值來分配數組。所以,我想大部分的開銷(即垃圾)是由於一次性矢量... – digEmAll 2012-07-26 08:52:05

+0

但是,我猜垃圾收集器會在內存不足時自動觸發,所以我不認爲這會是性能只要數組適合內存,就會出現問題... – digEmAll 2012-07-26 08:55:00