2012-12-21 37 views
4

我打算使用R中的「clhs」包提取來自羣體(a,b,c,d,...參見下文)的代表性樣本。採樣過程需要在我的(多核)計算機上很長時間,所以我想並行運行採樣程序(同時使用多個CPU核心)。使用多個核心並行運行拉丁超立方體採樣

這些是我的一些(例如)數據幀從其中我要繪製的樣品(「羣體」)的:

a <- as.data.frame(replicate(1000, rnorm(20))) 
b <- as.data.frame(replicate(1000, rnorm(20))) 
c <- as.data.frame(replicate(1000, rnorm(20))) 
d <- as.data.frame(replicate(1000, rnorm(20))) 

的CLHS代碼我想運行是:

clh_a <- clhs(x=a, size=round(nrow(a)/5), iter=2000, simple=F)) # 20% of all samples should be selected 
clh_b <- clhs(x=b, size=round(nrow(b)/5), iter=2000, simple=F)) 

etc ...

什麼是並行運行此採樣過程的方式?或者還有另一種有效的方式來做到這一點?

附錄(非常感謝 「zipfzapf」):

我試圖用 「parLapply」 - 不幸的是,到了最後,R是拋出一個錯誤消息說:在長度「錯誤(X) :'x'不見了「,我真的不明白......任何想法?

我的代碼:

library("snow") 
      a <- as.data.frame(replicate(1000, rnorm(20))) 
      b <- as.data.frame(replicate(1000, rnorm(20))) 
      c <- as.data.frame(replicate(1000, rnorm(20))) 
    d <- as.data.frame(replicate(1000, rnorm(20))) 
    abcd <- list(a, b, c, d) 
    cl <- makeCluster(4) 
    results <- parLapply(cl, 
     X = abcd, 
     FUN = function(i) { 
     clhs(x = i, size = round(nrow(i)/5), iter = 2000, simple = FALSE) 
     }, 
    ) 

回答

3

這對我有用(注意我改變了迭代的次數,以合理的速度移動)。

library(snowfall) 
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") 
sfLibrary(clhs) 

x <- sfLapply(abcd, fun = function(x) { 
      clhs(x = x, size=round(nrow(x)/5), iter = 200, simple =FALSE) 
     }) 

    Length Class  Mode 
[1,] 5  cLHS_result list 
[2,] 5  cLHS_result list 
[3,] 5  cLHS_result list 
[4,] 5  cLHS_result list 
+0

確實,你使用「sfLapply」的解決方案似乎效果不錯!我剛剛觀察到奇怪的system.time值,這可能是由於並行模式...?無論如何,非常感謝,這節省了我很多時間! – Chega

1

從(內置)包裝parallel功能mclapplylapply多核版本:

library(parallel) 

# population samples 
abcd <- list(a, b, c, d) 

# multi-core version of 'lapply(abcd, [....])' 
results <- parallel::mclapply(
    X = abcd, 
    FUN = function(elem) { 
    clhs(x = elem, size = round(nrow(elem)/5), iter = 2000, simple = FALSE)) 
    }, 
    mc.preschedule = FALSE, 
    mc.cores = 4L 
) 

這會給你一個列表,其中每個元素都包含調用相應的clhs的結果。

請注意,參數mc.preschedulemc.cores是可選的。設置mc.prescheduleFALSE是一個好主意,如果每個函數調用FUN可能需要一段時間(如在你的情況)。

+0

非常感謝!這個解決方案看起來非常優雅!不幸的是,我忘了提及我在Win7(64b)上使用R(2.15.2) - 我想這就是爲什麼R告訴我:「並行錯誤:: mclapply(X = abcd,FUN = function(elem ){:'mc.cores'> 1在Windows上不受支持「。是否有與Windows相同的軟件包? – Chega

+0

您可能會檢查[此帖](http://stackoverflow.com/questions/4775098/r-with-看起來,[package'snow'](http://cran.r-project.org/web/packages/snow/index.html)提供了函數(_e.g._ 'parLapply'),其工作方式與上面的Windows設置類似 – QkuCeHBH

+0

@Chega您可以使用'snow''有點像'snow'。 –

0

一個解決方案使用 「雪花」 - 只需添加 「clusterEvalQ(CL,庫(CLHS))」 的伎倆:再次

a <- as.data.frame(replicate(1000, rnorm(20))) 
b <- as.data.frame(replicate(1000, rnorm(20))) 
c <- as.data.frame(replicate(1000, rnorm(20))) 
d <- as.data.frame(replicate(1000, rnorm(20))) 
abcd <- list(a, b, c, d) 
library("snow") 
cl <- makeCluster(4) 
clusterEvalQ(cl, library(clhs)) 
results <- parLapply(cl, abcd, fun = function(elem) { 
    clhs(x = elem, size = round(nrow(elem)/2), iter = 50) 
    }) 
stopCluster(cl) 

非常感謝zipfzapf &羅馬Luštrik!