我在64位Ubuntu环境中运行64位R 3.1,内存为400 GB,在处理大型矩阵时遇到了一个奇怪的限制。
我有一个叫做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是极限。然而,事实并非如此,考虑到我的环境。
对于这种矩阵,我不应该使用原生矩阵类型吗?
4条答案
按热度按时间brccelvz1#
矩阵只是一个原子向量,它有一个维度属性,允许R将其作为矩阵访问。你的矩阵是一个长度为
4000*9000000
的向量,它是3.6e+10
个元素(最大整数值约为2.147e+9
)。对于原子向量(即,访问超过2.147e+9
限制的元素)。把你的矩阵当作一个长向量。如果我们还记得默认情况下R填充矩阵列,那么如果我们想检索
test[ 2701 , 850000 ]
处的值,我们可以通过以下方式访问它:请注意,这实际上是长向量子集,因为:
unftdfkk2#
另一种快速的解决方案是首先得到矩阵的行,然后是列(现在是结果向量的第i个元素)。比如...
当然,这会产生一些开销,因为首先复制/访问整行,但读取起来更简单。也适用于先提取列,然后提取行。
j8yoct9x3#
TL;DR -尝试从块标题的花括号中删除
cache=TRUE
参数。我对 Dataframe 有1,720,238个观察值和302个变量,这低于Simon提到的阈值(1,720,238 *302 = 5.2e+8 < 2.147e+9)
@subhash answer提示我尝试完全删除该高速缓存参数,这为我修复了错误。
blpfk2vs4#
图书馆(针织)
knitr::option$set(cache = TRUE,warning = FALSE,message = FALSE,cache.lazy = FALSE)