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

时间:2019-01-28 15:39:40

标签: r memory sparse-matrix xgboost

我知道过去曾有人问过这个问题(例如herehere),但是这些问题已经存在多年了,尚未解决。我想知道自那时以来是否创建了任何解决方案。问题是R中的Matrix包无法处理长向量(长度大于2 ^ 31-1)。在我的情况下,由于内存和时间的限制,稀疏矩阵对于运行XGBoost模型是必需的。 XGBoost xgb.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)
  

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

截至2019年,该问题是否有解决方案?

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

1 个答案:

答案 0 :(得分:1)

具有 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'

某些链接:

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