我在具有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的向量是限制。但是,鉴于我的环境,情况并非如此。
我不应该在这种矩阵中使用原生矩阵类型吗?
答案 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)