2017-09-28 56 views
2

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

m1 = (runif(5*10^7), ncol=10000, nrow=5000) 

使用了大约380 MB。我需要在内存中同时处理许多这样的矩阵(例如,在它们上面添加或乘上它们或者对其进行函数处理)。总而言之,由于存储在内存中的多个矩阵,我的代码使用了4 GB的RAM。我正在考虑更有效地存储数据的选项(即以一种占用更少RAM的方式)。

我看过Rpackagebigmemory被推荐。但是:

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

不知道它是否会满足您的需求,但包e1071具有稀疏矩阵功能 – Jake

+0

在你的第二个代码块,'runif(5 * 10^7)'是什么吞噬了你的记忆,因此将其分配给big.matrix将无济于事。想想你想如何初始化你的矩阵。 –

+0

@洪Ooi目前尚不清楚OP是否使用它来初始化矩阵。他们可能只是将其用作他们正在使用的数据类型的一个例子。如果这确实具有代表性,则稀疏矩阵并不合适。 OP要么必须处理大量正在使用的内存,要么重写代码以使用硬盘。 – Acccumulation

回答

0

根据你的数据集的构成,sparse.matrix可能是你最好的前进方向。这是提高空间和时间效率的常用且极其有用的方法。事实上,很多R包需要使用稀疏矩阵。

+0

不幸的是,我相信我的数据并不稀疏。矩阵充满浮子。 – tomka

1

解决方案是使用存储在文件中的矩阵工作,即在调用big.matrix()函数中设置backingfile而不是NULL

+0

这会妨碍在RAM +页面文件中使用'matrix'吗? – tomka

+0

是的。根据我的经验,使用我的package'filematrix'甚至更好,但是你的里程可能会有所不同。 –

1

使用文件备份big.matrix从包bigmemory是一个很好的解决方案。

但是,使用runif(5*10^7)分配整个矩阵使您可以在内存中创建此大型临时向量。但是,如果您使用gc(reset = TRUE),则会看到该内存使用消失。

如果要按块(例如500列的块)初始化矩阵,可以使用包bigstatsr。它使用与文件backback 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) 
+0

'big.matrix'的帮助文件表示使用文件后端可能会妨碍性能。使用文件后端比在RAM +页面文件中使用'matrix'还要更高效(后者用于多余的内存)? – tomka

+1

@tomka如果您指的是“pagefile”,那么这是可能发生在您身上的最糟糕的事情。当然,如果你有足够的内存,使用标准R矩阵将是最快的。但我认为Filebacked Big Matrices是一个很好的折衷方案。 –