对长向量(超过 2^31 个元素)的稀疏矩阵支持

drj*_*122 5 memory r sparse-matrix xgboost

我知道这个问题过去曾被问过(例如,这里这里),但这些问题已经存在多年并且尚未解决。我想知道从那时起是否创建了任何解决方案。问题是 R 中的 Matrix 包无法处理长向量(长度大于 2^31 - 1)。就我而言,由于内存和时间限制,运行 XGBoost 模型需要稀疏矩阵。XGBoostxgb.DMatrix支持使用dgCMatrix对象。但是,由于我的数据大小,尝试创建稀疏矩阵会导致错误。这是这个问题的一个例子。(警告:这使用 50-60 GB RAM。)

i <- rep(1, 2^31)
j <- i
j[(2^30): length(j)] <- 2
x <- i
s <- sparseMatrix(i = i, j = j, x = x)
Run Code Online (Sandbox Code Playgroud)

validMethod(as(object, superClass)) 中的错误:尚不支持长向量:../../src/include/Rinlinedfuns.h:137

截至2019年,这个问题有解决方案吗?

我正在使用该包的最新版本Matrix,1.2-15。

Flo*_*ian 2

稀疏矩阵代数 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)

一些链接:

我是dotCall64spam的作者之一。