有没有办法在R中创建使用比标准矩阵更少的内存的矩阵?

时间:2017-09-28 21:08:26

标签: r performance matrix memory

在我的机器上,

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吗?

3 个答案:

答案 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包都要求你使用稀疏矩阵。