2013-10-09 40 views

回答

24

你可以只使用lapplysapply並行版本,而不是說要複製這個表達式n時候,你做1:n,取而代之的是應用給出一個表達式,你將該表達式包裝在忽略發送給它的參數的函數中。

可能是這樣的:

#create cluster 
library(parallel) 
cl <- makeCluster(detectCores()-1) 
#get library support needed to run the code 
clusterEvalQ(cl,library(repsych)) 
#put objects in place that might be needed for the code 
clusterExport(cl,c("myData")) 
#... then parallel replicate... 
parSapply(cl, 1:10000, function(i,...) { x <- rnorm(10); mean(x)/sd(x) }) 
#stop the cluster 
stopCluster(cl) 

爲並聯等效:

replicate(10000, {x <- rnorm(10); mean(x)/sd(x) }) 
+1

謝謝,這是我最終做的,當我讀到複製只是一個包裝的寶物。 – bdeonovic

-1

這是最好的我能想出:

cl <- makeCluster(getOption("cl.cores", 4)) 
clusterCall(cl, replicate(50, simulate_fxns())) 
stopCluster(cl) 
+0

'clusterCall'一次執行一個函數在集羣中的每個工作人員,返回與許多元素的列表。這似乎不像「複製」給我。 –

+0

是的,我也剛剛意識到這一點。仍在努力尋找更好的答案。有任何想法嗎? – bdeonovic

+0

這個新的例子不起作用,因爲你將一個表達式傳遞給'clusterCall'而不是一個函數。它可以和'clusterEvalQ'一起工作,但你也需要導出'simulate_fxns'。 –

2

使用clusterEvalQ作爲一種模式,我想我會實現一個並行replicate爲:

parReplicate <- function(cl, n, expr, simplify=TRUE, USE.NAMES=TRUE) 
    parSapply(cl, integer(n), function(i, ex) eval(ex, envir=.GlobalEnv), 
      substitute(expr), simplify=simplify, USE.NAMES=USE.NAMES) 

參數simplifyUSE.NAMESsapply兼容,而不是replicate,但在我看來,它們使其成爲parSapply的更好包裝。

下面是來自replicate手冊頁導出一個例子:

library(parallel) 
cl <- makePSOCKcluster(3) 
hist(parReplicate(cl, 100, mean(rexp(10))))