33

根据 R 'Memory-limits' 文档,不可能分配长度超过 2^31-1 的向量。这是因为用作索引的整数只能使用 31 位(符号位)。但在 64 位系统上,我应该能够分配更长的向量。为什么 R 在 64 位系统上施加相同的最大长度?有没有办法绕过限制?

4

2 回答 2

25

如果你愿意使用 R 的开发版本,你可以得到这个特性的实验性支持。来自http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html

长向量

在 64 位平台上开始支持超过 2^31 - 1 个元素的向量。这适用于原始、逻辑、整数、双精度、复数和字符向量以及列表。(字符向量的元素仍然限制为 2^31 - 1 个字节。)

所有方面目前都是实验性的。

目前可以对此类向量执行的操作有些有限,并且大多数操作将返回错误“尚不支持长向量”。它们可以被序列化和非序列化、强制、相同() 和 object.size() 工作,并且可以计算手段。它们的长度可以通过 xlength() 获取和设置:在长向量上调用 length() 将引发错误。

索引的大多数方面都是可用的。通常双值索引可用于访问超过 2^31 - 1 的元素。

请参阅链接查看更多细节。我自己根本没有尝试过这个,所以我不能评论它是否真的有用。

如果您访问http://developer.r-project.org/R_svnlog_2011(和http://developer.r-project.org/R_svnlog_2012)并搜索“长向量”,您可以了解所做的工作继续。

于 2012-05-17T18:14:11.200 回答
18

这里有更多细节可以补充 Ben 的答案。这些限制似乎是从用于构建 R 的较低级别的编程语言继承而来的,尤其是(显然)FORTRAN 代码。因此,显然,将 R 转换为能够充分利用 64 位寻址系统将是一个重大项目。

R-admin 手册

即使在 R 的 64 位版本上,R 对象的大小也有限制(请参阅帮助(“内存限制”),其中一些源于使用 32 位整数(尤其是在 FORTRAN 代码中)。在所有版本中在 R 中,向量的最大长度(元素数)是 2^31-1,大约 20 亿,并且在 64 位构建上,分配的内存块的大小限制为 2^34-1 字节(8GB ). 预计这些最终将被提出*,但对 8GB 对象的需求是(当这是在 2011 年编写时)例外。

(手册中还有一个奇怪的脚注,我在其中放了一个*,并指出“此评论自 2005 年以来一直在手册中”。:)

于 2012-05-17T18:26:49.813 回答