我有一個相當大的數據集(約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
。我能夠以直截了當的方式複製我的摺疊任務。
我想我會留下引用你的** data.table **包的強制性註釋,這通常在這些事情上要快得多。 – joran 2011-12-29 15:29:55
嘿,你打敗了我! – 2011-12-29 15:32:04
你真的有8個核心嗎?或者更確切地說是一個帶有4個核心和4個「超線程」核心的英特爾?我有一個運行在MPICH(不是R)下的應用程序,它可以在50%的CPU上很好地擴展到4個,但是當要求8個內核提供100%的CPU時,運行速度要慢得多。 – 2011-12-29 15:36:32