我使用一些C ++代码从数据库中获取文本文件,并从Matrix
包创建一个dgcMatrix类型的稀疏矩阵。我第一次尝试构建一个具有2 ^ 31-1个非稀疏成员的矩阵,这意味着稀疏矩阵对象中的索引向量也必须长于该限制。不幸的是,向量似乎使用32位整数索引,Rcpp中的NumericVectors也是如此。
如果没有从头开始编写全新的数据类型,R是否为此提供了任何便利?我不认为我可以使用太奇特的解决方案,因为我需要glmnet
来识别结果对象。
在最近的R版本中,向量由R_xlen_t
类型索引,在64位平台上为64位,在32位平台上仅为int
。
到目前为止,Rcpp仍在使用int
。我鼓励你在their issue list上请求这个功能。这并不难,但需要有技能,时间和意愿的人的系统参与。 Rcpp11
的开发版本使用正确的类型,也许他们可以将其用作模型。
但请注意,即使R在64位平台上使用64位无符号整数,实际上也只限于double
类型可以处理的范围,如果你要求矢量的length
,R就会给你。 R没有可以原生代表的64位整数类型,所以当你要求矢量的长度时,你可以得到一个int
或double
,具体取决于值。
具有spam64扩展名的稀疏矩阵代数R包垃圾邮件支持具有超过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'
该实现基于.C64()
R接口,以及dotCall64中可用的编译代码。
注意:并非所有垃圾邮件功能都支持64位矩阵(尚未)。
一些链接:
我是dotCall64和垃圾邮件的作者之一。