【发布时间】:2012-05-17 17:50:09
【问题描述】:
根据 R 的“内存限制”文档,无法分配长度超过 2^31-1 的向量。这是因为用作索引的整数只能使用 31 位(符号位)。但在 64 位系统上,我应该能够分配更长的向量。 为什么 R 在 64 位系统上施加相同的最大长度?有没有办法绕过限制?
【问题讨论】:
-
请注意,此限制已在 R-3.0.0 中删除。
标签: r
根据 R 的“内存限制”文档,无法分配长度超过 2^31-1 的向量。这是因为用作索引的整数只能使用 31 位(符号位)。但在 64 位系统上,我应该能够分配更长的向量。 为什么 R 在 64 位系统上施加相同的最大长度?有没有办法绕过限制?
【问题讨论】:
标签: r
如果您愿意使用 R 的开发版本,您可以获得对这个功能的实验性支持。来自http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html:
长向量
开始支持向量的时间超过 2^31 - 64 位平台上的 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)并搜索“长向量”,您可以了解正在进行的工作。
【讨论】:
这里有更多细节可以补充 Ben 的回答。这些限制似乎是从用于构建 R 的较低级别的编程语言继承而来的,尤其是(显然)FORTRAN 代码。因此,显然,将 R 转换为能够充分利用 64 位寻址系统将是一个重大项目。
即使在 R 的 64 位版本上,R 对象的大小也有限制(请参阅帮助(“内存限制”),其中一些源于使用 32 位整数(尤其是在 FORTRAN 代码中)。在 R 的所有构建中,向量的最大长度(元素数量)为 2^31-1,大约为 20 亿,而在 64 位构建中,分配的内存块的大小限制为 2^34-1字节(8GB)。预计这些最终将被提高*,但对 8GB 对象的需求(当这是在 2011 年编写时)是例外的。
(手册中还有一个奇怪的脚注,我在其中添加了*,并指出“此评论自 2005 年以来一直在手册中”。:)
【讨论】: