【问题标题】:negative length vectors are not allowed while applying operation on a huge matrix对巨大矩阵应用运算时,不允许使用负长度向量
【发布时间】:2017-06-23 15:56:16
【问题描述】:

我有一个矩阵 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 内存( ubuntu16 , r4.8xlarge ),我一直在监控它以查看内存是否耗尽,但似乎内存仍然很好。 如果我可以将它变成一个稀疏矩阵,那么我可以将大小减小到 3 Gb,因为大多数元素都是零(95% 是零)。

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

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

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

【问题讨论】:

  • 如何创建这个矩阵?
  • 通过将 DAT 文件加载到 data.frame 中,然后转换为矩阵
  • 我会解析文件并从头开始创建一个稀疏矩阵。但是,您可能应该使用 R 以外的工具来提高效率。
  • 是关于向量长度限制(.Machine$integer.max, 2^31)?矩阵在内部存储为向量。 dense_to_Csparse(可能在 C 中)是否有可能不允许超过 2^31 的任何内容?

标签: r memory sparse-matrix


【解决方案1】:

您可以拆分矩阵 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()

【讨论】:

    猜你喜欢
    • 2018-02-08
    • 2019-10-14
    • 1970-01-01
    • 2017-07-17
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2013-05-04
    相关资源
    最近更新 更多