2017-09-28 59 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是一個很好的折衷方案。 –