在巨大的矩阵上应用操作时,不允许使用负长度向量

时间:2017-06-23 15:56:17

标签: r memory sparse-matrix

我有一个矩阵M1(3644069845个元素,27.2 Gb)

dim(M1)
[1]   5785 629917

此矩阵上涉及解析元素的任何操作都会以错误结束 很少例如:

SM1<-as(M1,"dgCMatrix")
Error in .Call(dense_to_Csparse, from) : 
  negative length vectors are not allowed

请注意,我的系统有240 GB ram(ubuntu16,r4.8xlarge),我一直在监视它以查看RAM是否已经耗尽,但似乎RAM仍然没问题。 如果我可以将其设置为稀疏矩阵,那么我可以将大小减小到3 Gb,因为多数元素是零(95%是零)。

任何使其成为稀疏矩阵的建议都会有所帮助。

以下帖子的建议 R - data frame - convert to sparse matrix

稀疏,不起作用。 4个小时后我停止了执行。

1 个答案:

答案 0 :(得分:2)

你可以拆分你的矩阵M1,使其在稀疏时不超过矢量长度限制(2 ^ 31),然后使分割的矩阵稀疏并再次组合:

# Split
m11 <- M1[,0:314958]
m12 <- M1[,314959:nrow(M1)]

# Sparse
m11_sparse <- Matrix(as.matrix(m11), sparse = TRUE)
m12_sparse <- Matrix(as.matrix(m12), sparse = TRUE)

# Combine
M1_sparse <- cbind(m11_sparse,m12_sparse)

# Clean
rm(M1,m11,m12,m11_sparse,m12_sparse)
gc()