我知道过去曾问过这个问题(例如here和here),但这些问题已有数年之久且尚未解决。我想知道从那时起是否已经创建了任何解决方案。问题是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。
具有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'
一些链接:
我是dotCall64和垃圾邮件的作者之一。