R Windows 64bit版本中不支持长矢量但错误

时间:2014-01-15 15:00:19

标签: r memory memory-management operating-system size

我正在尝试测试当前R版本中的内存限制。

runtest <- function(size) {
  x <- "testme"
  while(0<1) {
    x <- c(x, x)
    size <<- object.size(x)  # size of x when fail
  }
}

通过在我的笔记本电脑上的控制台中运行runtest(size),我收到以下错误:

> runtest(size)
Error: cannot allocate vector of size 4.0 Gb
In addition: Warning messages:
1: In structure(.Call(C_objectSize, x), class = "object_size") :
  Reached total allocation of 7915Mb: see help(memory.size)
2: In structure(.Call(C_objectSize, x), class = "object_size") :
  Reached total allocation of 7915Mb: see help(memory.size)
3: In structure(.Call(C_objectSize, x), class = "object_size") :
  Reached total allocation of 7915Mb: see help(memory.size)
4: In structure(.Call(C_objectSize, x), class = "object_size") :
  Reached total allocation of 7915Mb: see help(memory.size)
> size
2147483736 bytes
> 

此尺寸看起来非常接近人们之前提到的2 ^ 31-1限制。然后我尝试在我们升级的桌面上运行相同的代码,使用128GB的RAM,并将64位版本的快捷方式中的变量设置为100GB的最大内存使用量。这是我得到的新错误:

Error in structure(.Call(C_objectSize, ), class = "object_size"):
  long vectors not supported yet: unique.c: 1720
> size
8589934680 bytes
>

此8.5GB限制是否与在Windows O / S(特别是Windows 7企业版)中运行有关?我认为R帮助文件(http://stat.ethz.ch/R-manual/R-devel/library/base/html/Memory-limits.html)解释了这一点,但我无法理解它的含义(不是我的专业领域)。

2 个答案:

答案 0 :(得分:8)

查看size.cunique.c的来源,看起来用于改进object.size的哈希不支持长向量:

/* Use hashing to improve object.size. Here we want equal CHARSXPs,
   not equal contents. */

/*  Currently the hash table is implemented as a (signed) integer
    array.  So there are two 31-bit restrictions, the length of the
    array and the values.  The values are initially NIL (-1).  O-based
    indices are inserted by isDuplicated, and invalidated by setting
    to NA_INTEGER.
*/

因此,object.size正在窒息。如何调用numeric(2^36)来查看是否可以创建这么大的对象(应该是64GB)。

答案 1 :(得分:3)

最近版本的R中的最大向量长度是2 ^ 53-1,因为在双存储模式的尾数中有53位。矩阵或数组的每个维度的最大范围仍然是2 ^ 32-1,因为维度值仍然基于整数存储模式。我想我可能会从news()获得更多信息,但没有达到我想象的那么多。在r-devel邮件列表上对此进行了相当多的讨论,如果我需要更多,我会使用MarkMail的存档搜索。

?double
?integer

db <- news()
str(db)
db$Text[grepl("vector", db$Text) & grepl("length", db$Text)]
# only slsightly informative
db$Text[grepl("vector", db$Text) & grepl("long", db$Text)][3]
  

[1]“支持超过2 ^ 31 - 1个元素的向量。这个\适用于原始,逻辑,整数,双精度,复数和字符\ nvector,以及列表。(字符向量的元素仍然存在\ n限制为2 ^ 31 - 1个字节。)“