2012-07-26 91 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