【问题标题】:R - Memory allocation besides objects in ls()R - 除了 ls() 中的对象之外的内存分配
【发布时间】:2015-07-15 18:01:10
【问题描述】:

我已经使用 data.table 加载了相当大的数据集。然后,我想使用以下形式的说明添加大约 30 列:

DT[, x5:=cumsum(y1), by=list(x1, x2)]
DT[, x6:=cummean(y2), by=x1]

在某些时候,我开始收到这样的“警告”:

1: In structure(.Call(C_objectSize, x), class = "object_size") :
Reached total allocation of 8072Mb: see help(memory.size)

我不时检查 tracemem(DT) 以确保没有复制。我得到的唯一输出是:

"<0000000005E8E700>"

我还检查 ls() 以查看正在使用的对象和 object.size() 以查看对象分配了多少 RAM。 ls() 的唯一输出是我的 data.table,第一个错误后的对象大小是 5303.1 Mb。 我在运行 R 的 64 位 Windows 64 位机器上,并且有 8 GB RAM。当我收到警告时,这些 8 GB RAM 中只有 80% 正在使用中。其中 R 使用 5214.0 Mb(奇怪,因为表比这个大)。

我的问题是,如果 R 使用的唯一 RAM 是 5303.1 Mb,而我仍然有大约 2 Gb 的可用内存,为什么我会收到 R 已达到 8 Gb 限制的错误,有什么我可以做的吗?它?如果没有,还有什么其他选择?我知道我可以使用 Bigmemory,但随后我将不得不重写我的整个代码,并且会丢失 data.table 提供的甜蜜的按引用修改。

【问题讨论】:

  • 预先分配列时会发生什么? IE。首先运行alloc.col(DT, your.final.num.of.columns),然后添加各个列。
  • 我的最终列数是 97。当我尝试 alloc.col(DT, 97) R 告诉我我不能减少分配的列数,因为已经分配了 100 列。但是,我只是将分配的列增加到 150,然后看看它的作用,谢谢!
  • 购买更多内存。 blog.codinghorror.com/…
  • @DeanMacGregor 我很乐意,但我有一台只有一个 RAM 插槽高达 8 Gb 的联想 11s。由于经济限制,我也无法购买新电脑。

标签: r memory data.table


【解决方案1】:

问题在于,这些操作需要的 RAM 超出了对象本身占用的内存。您可以验证 windows 正在使用页面文件。如果是,您可以尝试增加其大小。 http://windows.microsoft.com/en-us/windows/change-virtual-memory-size

如果失败,您可以尝试运行 Lubuntu linux 的实时环境,以查看其内存开销是否足够小以允许操作。 http://lubuntu.net/

最终,我怀疑你将不得不使用 bigmemory 或类似的东西。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2011-11-10
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2014-11-29
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多