在我的机器上,
m1 = ( runif(5*10^7), ncol=10000, nrow=5000 )
耗尽约380 MB。我需要在内存中同时处理许多这样的矩阵(例如,在它们上面添加或乘以它们或apply
函数)。总而言之,由于存储在内存中的多个矩阵,我的代码占用了4 GB的RAM。我正在考虑更有效地存储数据的选项(即以一种占用较少RAM的方式)。
我看到推荐R
package bigmemory
。但是:
library(bigmemory)
m2 = big.matrix( init = 0, ncol=10000, nrow=5000 )
m2[1:5000,1:10000] <- runif( 5*10^7 )
使R使用与我使用Windows任务管理器验证的内存相同的内存量。所以我预计没有大的收获,或者我错了,我应该以不同的方式使用big.matrix
吗?
答案 0 :(得分:1)
解决方案是使用存储在文件中的矩阵,即在调用backingfile
函数时将NULL
设置为big.matrix()
。
答案 1 :(得分:1)
使用 bigmemory 包中的filebacked big.matrix
是一个很好的解决方案。
但是,使用runif( 5*10^7 )
指定整个矩阵可以在内存中创建这个大的临时向量。但是,如果您使用gc(reset = TRUE)
,您将看到此内存使用情况消失。
如果要逐块初始化矩阵(比如500列的块),可以使用包 bigstatsr 。它使用与filebacked big.matrix
类似的对象(称为FBM
)并默认将它们存储在临时目录中。你可以这样做:
library(bigstatsr)
m1 <- FBM(1e4, 5e3)
big_apply(m1, a.FUN = function(X, ind) {
X[, ind] <- runif(nrow(X) * length(ind))
NULL
}, a.combine = 'c', block.size = 500)
答案 2 :(得分:0)
根据数据集的构成,sparse.matrix可能是您最好的前进方式。这是提高空间和时间效率的常用且非常有用的方法。实际上,很多R包都要求你使用稀疏矩阵。