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

问题描述 投票:3回答:2

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

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

r 32bit-64bit sparse-matrix rcpp
2个回答
3
投票

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

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

但请注意,即使R在64位平台上使用64位无符号整数,实际上也只限于double类型可以处理的范围,如果你要求矢量的length,R就会给你。 R没有可以原生代表的64位整数类型,所以当你要求矢量的长度时,你可以得到一个intdouble,具体取决于值。


3
投票

具有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和垃圾邮件的作者之一。

© www.soinside.com 2019 - 2024. All rights reserved.