一个值为0的R矩阵单元需要多少空间?如何处理大矩阵计算?

3

我想为一个矩阵计算相关性,但由于内存不足而被程序停止。

M = matrix(0, length(user), length(mat))   

当我运行这条命令时,我收到了一条消息

错误:无法分配大小为146487.5 Gb的向量

供您参考

length(user) = 6728367
length(mat) = 2922138

0值矩阵单元需要占用多少空间?

此外,如何处理基于稀疏矩阵的矩阵计算?有没有相关软件包?或者我可以进行多核计算?

1个回答

3

您的错误信息中提到需要多少空间:146,487.5 GB。

如果您想使用这么大的矩阵,可以使用稀疏矩阵:

library(Matrix)
user = 6728367
mat = 2922138
M = Matrix(0, user, mat)  
这将起作用:
> str(M)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int(0) 
  ..@ p       : int [1:2922139] 0 0 0 0 0 0 0 0 0 0 ...
  ..@ Dim     : int [1:2] 6728367 2922138
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num(0) 
  ..@ factors : list()

这里有一个教程(点击此处),你可以在网上找到更多相关内容。该软件包通过优化数学计算,使得像M * M这样的操作也能够快速完成。 同时,你也可以参考(点击此处)


谢谢,这个新构建的矩阵可以使用一些现有的方法,比如colSums、crossprod,甚至可以使用M[c(1,2)] = 0来赋值,这使得它非常方便。 - cloudscomputes
没问题。这是一个非常方便的稀疏矩阵包。它已经存在很长时间了,并且得到了很好的维护。 - LyzandeR
顺便问一下,你知道将数字数据框转换为这种类型的矩阵的方法吗?这个方法类似于正常矩阵的as.matrix()方法。 - cloudscomputes
一种方法是:as(as.matrix(df_here), 'sparseMatrix') - LyzandeR
这对于非常大的数据框不起作用,因为as.matrix会为大矩阵抛出错误,我需要使用特定的行索引、列索引和值构建稀疏矩阵,我认为这是另一个有趣的话题,必须有一些优雅的解决方案,但到目前为止,我的原始相关计算问题已经在1分钟内完全解决。我将接受您的答案作为正确答案,并再次感谢您。 - cloudscomputes
很高兴能够帮助:)。随时可以就此发布另一个问题,我相信社区会提供帮助。这是一个有趣的话题。 - LyzandeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,