2013-10-09 18 views
18

Ich bin begeistert von dem parallel Paket in R und wie einfach und intuitiv zu tun, ist es parallele Versionen von apply, sapply usw.einfachste Weg parallel replizieren

Gibt es eine ähnliche Parallelfunktion für replicate zu tun?

Antwort

24

Sie können nur die parallelen Versionen von lapply verwenden oder sapply, anstatt zu sagen, dieser Ausdruck zu replizieren n mal Sie gelten die auf 1:n und stattdessen Wenn Sie einen Ausdruck angeben, umbrechen Sie diesen Ausdruck in einer Funktion, die das an ihn gesendete Argument ignoriert.

möglicherweise so etwas wie:

#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) 

als parallel Äquivalent:

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

Danke, das ist, was ich getan habe, als ich gelesen habe, dass Replikat nur ein Wrapper für sapply war. – bdeonovic

-1

Dies ist das Beste, was ich tun konnte:

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

'clusterCall' für jeden Arbeitnehmer in einem Cluster eine Funktion einmal ausgeführt wird, eine Liste mit, dass viele Elemente zurück. Das scheint mir nicht viel zu "replizieren". –

+0

Ja, das habe ich gerade auch gemerkt. Ich versuche immer noch, eine bessere Antwort zu finden. Irgendwelche Ideen? – bdeonovic

+0

Dieses neue Beispiel funktioniert nicht, weil Sie einen Ausdruck an 'clusterCall' und nicht an eine Funktion übergeben. Es würde mit 'clusterEvalQ' funktionieren, aber Sie müssten auch' simulate_fxns' exportieren. –

2

Mit clusterEvalQ als Modell, ich glaube, ich parallel replicate wie implementieren würde:

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) 

Die Argumente simplify und USE.NAMES sind kompatibel mit anstatt replicate, aber sie machen es zu einem besseren Wrapper um parSapply meiner Meinung nach.

Hier ist ein Beispiel von der Seite replicate Mann abgeleitet:

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