2011-12-29 63 views
7

我有一個相當大的數據集(約140米行),我正在做一些分裂和總結。整個事情需要一段時間來運行,我的最終應用依賴於頻繁跑動,所以我的想法是使用doMC.parallel=TRUE標誌,象這樣plyr(簡化了一下):使用plyr,doMC,並總結()與非常大的數據集?

library(plyr) 
require(doMC) 
registerDoMC() 

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

如果我設置內核數顯式爲2(使用registerDoMC(cores=2))我的8 GB內存看到我通過,它削減了相當多的時間。但是,如果我讓它使用全部8個內核,則由於每個分叉進程似乎都將整個數據集複製到內存中,因此我很快耗盡內存。

我的問題是,是否有可能以更節省內存的方式使用plyr的並行執行工具?我想我的數據幀轉換爲big.matrix,但這只是似乎迫使整個事情重新使用單核心:

library(plyr) 
library(doMC) 
registerDoMC() 
library(bigmemory) 

bm <- as.big.matrix(df) 
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

這是我首次涉足多核[R計算,所以如果有一個更好的方法考慮到這一點,我願意提出建議。

UPDATE:就像生活中許多事情,事實證明我是在我的代碼的其他地方做其他愚蠢的事情,那多處理的整個問題成爲這種特定情況下一個爭論的焦點。但是,對於大數據摺疊任務,我會記住data.table。我能夠以直截了當的方式複製我的摺疊任務。

+3

我想我會留下引用你的** data.table **包的強制性註釋,這通常在這些事情上要快得多。 – joran 2011-12-29 15:29:55

+0

嘿,你打敗了我! – 2011-12-29 15:32:04

+2

你真的有8個核心嗎?或者更確切地說是一個帶有4個核心和4個「超線程」核心的英特爾?我有一個運行在MPICH(不是R)下的應用程序,它可以在50%的CPU上很好地擴展到4個,但是當要求8個內核提供100%的CPU時,運行速度要慢得多。 – 2011-12-29 15:36:32

回答

6

我不認爲plyr製作整個數據集的副本。但是,在處理大塊數據時,該子集將被複制到工作人員。因此,當使用更多的工人時,更多的子集同時在內存中(即8個而不是2個)。

我能想到的一些技巧,你可以嘗試:

  • 把你的數據在一個陣列結構的data.frame代替,並使用adply做總結。陣列在內存使用和速度方面效率更高。我的意思是使用正常的矩陣,而不是big.matrix。
  • 試一試data.table,在某些情況下,這會導致幾個數量級的速度增加。我不確定data.table是否支持並行處理,但即使沒有並行化,data.table可能會快得多。查看blog post of mine比較ave,ddplydata.table用於處理數據塊。
+1

你可能想檢查那篇博文。你正在比較的三個功能似乎在做不同的任務:只要其中一個正在計算平均值,據我所知。 – 2011-12-29 15:47:24

+0

謝謝,我會看看!我懷疑這並沒有改變這個帖子的結果,也就是說data.table更快。 – 2011-12-29 15:50:34