【问题标题】:Reserved memory of R is twice the size of an allocated arrayR 的保留内存是已分配数组大小的两倍
【发布时间】:2012-07-26 08:03:33
【问题描述】:

我发现了以下行为。假设我创建了以下多维数组:

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

R 应该为此使用多少内存是完全可以预测的,即 (96*48*60*360) * 4 字节 = 759.4 Mbyte。使用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 可以更快地访问它?有什么想法吗?

【问题讨论】:

    标签: r memory-management


    【解决方案1】:

    因为垃圾收集器还没有运行。
    所以有很多垃圾,可能是在创建大数组的过程中产生的,需要清除。

    如果您通过调用gc() 函数强制进行垃圾回收,您会看到已使用的内存将非常接近您的数组大小:

    > memory.size()
    [1] 775.96
    

    【讨论】:

    • 所以最终数组使用了 759.4 MB,但是在创建过程中它使用了更多?如果数组适合内存,那可能会很不幸,但创建期间内存使用量的峰值使用的内存量超过了可用内存量。
    • 好吧,我不知道幕后到底发生了什么,但是使用您的代码,您不仅仅是分配一个数组;实际上,首先生成一个随机数向量,然后通过复制该值来分配一个数组。所以,我猜大部分开销(即垃圾)是由于那个一次性向量......
    • 但是,我猜垃圾收集器会在内存不足时自动触发,所以我认为只要数组适合内存,这不会是性能问题......跨度>
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多