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

lg40wkob  于 2023-06-27  发布在  其他
关注(0)|答案(4)|浏览(107)

我在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是极限。然而,事实并非如此,考虑到我的环境。
对于这种矩阵,我不应该使用原生矩阵类型吗?

brccelvz

brccelvz1#

矩阵只是一个原子向量,它有一个维度属性,允许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
unftdfkk

unftdfkk2#

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

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

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

j8yoct9x

j8yoct9x3#

TL;DR -尝试从块标题的花括号中删除cache=TRUE参数。
我对 Dataframe 有1,720,238个观察值和302个变量,这低于Simon提到的阈值(1,720,238 *302 = 5.2e+8 < 2.147e+9)
@subhash answer提示我尝试完全删除该高速缓存参数,这为我修复了错误。

blpfk2vs

blpfk2vs4#

图书馆(针织)
knitr::option$set(cache = TRUE,warning = FALSE,message = FALSE,cache.lazy = FALSE)

相关问题