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

时间:2014-06-16 03:50:16

标签: r 32bit-64bit sparse-matrix rcpp

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

如果没有从头开始编写全新的数据类型,R是否为此提供了任何便利?我不认为我可以使用过于异国情调的解决方案,因为我需要glmnet来识别结果对象。

2 个答案:

答案 0 :(得分:3)

在最近的R版本中,向量由R_xlen_t类型索引,在64位平台上为64位,在32位平台上仅为int

到目前为止,Rcpp仍在使用int。我鼓励您在their issue list上申请该功能。这并不难,但需要有技能,时间和意愿的人的系统参与。 Rcpp11的开发版使用正确的类型,也许他们可以将其用作模型。

但是请注意,即使R在64位平台上使用64位无符号整数,实际上也只限于double类型可以处理的范围,如果你问的话R就会给你。对于向量的length。 R没有可以原生代表的64位整数类型,因此当您询问向量的长度时,您可以获得intdouble,具体取决于值。

答案 1 :(得分:3)

具有 spam64 扩展名的稀疏矩阵代数R软件包 spam 支持具有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'

此实现基于{strong> dotCall64 中提供的已编译代码的.C64() R接口。

注意:垃圾邮件 all 功能还不支持64位矩阵。

某些链接:

我是 dotCall64 垃圾邮件的作者之一。