R Windows 64 位版本中尚不支持长向量错误

问题描述 投票:0回答:2

我正在尝试测试当前 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 操作系统(特别是 Windows 7 企业版)中运行有什么关系吗?我认为 R 帮助文件(http://stat.ethz.ch/R-manual/R-devel/library/base/html/Memory-limits.html)解释了这一点,但我无法理解什么这是说(不是我的专业领域)。

r memory memory-management operating-system size
2个回答
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)。


3
投票

R最近版本的最大向量长度为2^53-1,因为双存储模式的尾数有53位。矩阵或数组的每个维度的最大范围仍然是 2^32-1,因为维度值仍然基于整数存储模式。我以为我可以从

news()
获得更多信息,但并没有得到我想象的那么多。在 r-devel 邮件列表上对此有很多讨论,我将使用 r-devel 邮件列表的高级搜索:https://www.google.com/advanced_search,将
https://stat.ethz.ch/pipermail/r-devel
放入如果我需要更多,请使用“站点”插槽。

?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 个元素的向量。这 适用于原始、逻辑、整数、双精度、复数和字符 向量,以及列表。 (字符向量的元素仍然保留 限制为 2^31 - 1 字节。)”

© www.soinside.com 2019 - 2024. All rights reserved.