如何在R中获得一个大的稀疏矩阵?(> 2^31-1)

Pat*_*thy 6 r sparse-matrix 32bit-64bit rcpp

我使用一些 C++ 代码从数据库中获取一个文本文件,并从Matrix包中创建一个 dgcMatrix 类型的稀疏矩阵。我第一次尝试构建一个具有超过 2^31-1 个非稀疏成员的矩阵,这意味着稀疏矩阵对象中的索引向量也必须长于该限制。不幸的是,向量似乎使用 32 位整数索引,就像 Rcpp 中的 NumericVectors 一样。

除了从头开始编写全新的数据类型之外,R 是否为此提供了任何便利?我不认为我可以使用太奇特的解决方案,因为我需要glmnet识别结果对象。

Flo*_*ian 5

稀疏矩阵代数 R 包spam及其spam64扩展支持具有超过 2^31-1 个非零元素的稀疏矩阵。

一个简单的示例(需要约 50 Gb 内存,运行时间约 5 分钟):

## -- a regular 32-bit spam matrix
library(spam) # version 2.2-2
s <- spam(1:2^30)
summary(s) 
## Matrix object of class 'spam' of dimension 1073741824x1,
##     with 1073741824 (row-wise) nonzero elements.
##     Density of the matrix is 100%.
## Class 'spam'

## -- a 64-bit spam matrix with 2^31 non-zero entries
library(spam64)
s <- cbind(s, s) 
summary(s) 
## Matrix object of class 'spam' of dimension 1073741824x2,
##     with 2147483648 (row-wise) nonzero elements.
##     Density of the matrix is 100%.
## Class 'spam'

## -- add zeros to make the dimension 2^31 x 2^31
pad(s) <- c(2^31, 2^31) 
summary(s) 
## Matrix object of class 'spam' of dimension 2147483648x2147483648,
##     with 2147483648 (row-wise) nonzero elements.
##     Density of the matrix is 4.66e-08%.
## Class 'spam'
Run Code Online (Sandbox Code Playgroud)

该实现基于dotCall64.C64()中可用的编译代码的 R 接口。

注意:并非所有spam功能都支持 64 位矩阵。

一些链接:

我是dotCall64spam的作者之一。

  • 不仅习惯上透露您是广告库的作者,而且通常您也不应该对多个问题回答同一件事。如果问题确实相同,则可以进行重复投票。您至少应该调整答案以回答您正在回答的确切具体问题 (2认同)

Rom*_*ois 4

在 R 的最新版本中,向量按类型进行索引R_xlen_t,在 64 位平台上为 64 位,而int在 32 位平台上则为 64 位。

Rcpp至今仍然int随处使用。我鼓励您在他们的问题列表中请求该功能。这并不难,但需要有技能、时间和意愿的人系统地参与。开发版本Rcpp11使用了正确的类型,也许他们可以使用它作为模型。

但请注意,即使 R 在 64 位平台上使用 64 位无符号整数,您实际上也受到该double类型可以处理的范围的限制,如果您要求length向量的 ,这就是 R 将为您提供的范围。R 没有可以原生表示的 64 位整数类型,因此当您询问向量的长度时,您会根据值得到anint或 a 。double