R中的大型矩阵:尚不支持长向量

时间:2014-06-20 21:10:42

标签: r vector matrix

我在具有400GB RAM的64位Ubuntu环境中运行64位R 3.1,在处理大型矩阵时遇到了一个奇怪的限制。

我有一个名为A的数字矩阵,即4000行乘950,000列。当我尝试访问其中的任何元素时,我收到以下错误:

Error: long vectors not supported yet: subset.c:733

虽然我的矩阵是通过scan读取的,但您可以使用以下代码进行复制

test <- matrix(1,4000,900000) #no error
test[1,1] #error

我的谷歌搜索显示这是R 3.0之前的常见错误消息,其中大小为2 ^ 31-1的向量是限制。但是,鉴于我的环境,情况并非如此。

我不应该在这种矩阵中使用原生矩阵类型吗?

3 个答案:

答案 0 :(得分:19)

矩阵只是一个具有维度属性的原子向量,允许R将其作为矩阵访问。您的矩阵是长度为4000*9000000的向量,它是3.6e+10个元素(最大整数值约为2.147e+9)。为原子向量子集支持长向量 (即访问超出2.147e+9限制的元素)。只需将矩阵视为长向量即可。

如果我们记得默认情况下R按列填充矩阵,那么如果我们想要检索test[ 2701 , 850000 ]处的值,我们可以通过以下方式访问它:

i <- ( 2701 - 1 ) * 850000 + 2701 
test[i]
#[1] 1

请注意,这确实是长矢量子集,因为:

2701L * 850000L
#[1] NA
#Warning message:
#In 2701L * 850000L : NAs produced by integer overflow

答案 1 :(得分:1)

另一种快速解决方案是首先得到矩阵的行,然后是矩阵(现在是结果向量的第i个元素)。例如......

test <- matrix(1,4000,900000) #no error 
test[1,1] #error
test[1, ][1] # no error

当然,这会产生一些开销,因为首先复制/访问整行,但它更容易阅读。 也适用于首先提取列然后提取行。

答案 2 :(得分:0)

库(编织器)

knitr :: option $ set(cache = TRUE,警告= FALSE,消息= FALSE,cache.lazy = FALSE)