2013-10-09 25 views

risposta

24

si può semplicemente utilizzare le versioni parallele di lapply o sapply, invece di dire di replicare questa espressione n volte non la applica sulla 1:n e invece di dare un'espressione, si avvolge quell'espressione in una funzione che ignora l'argomento inviato ad esso.

forse qualcosa di simile:

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

come l'equivalente parallelo di:

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

Grazie, questo è quello che ho finito quando ho letto che replicare era solo un involucro per zaffiro. – bdeonovic

-1

Questo è il meglio che ho potuto venire con:

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

'clusterCall' esegue una funzione di una volta per ogni lavoratore in un cluster, restituendo una lista con che molti elementi. Non mi sembra molto "replicare" per me. –

+0

Sì, l'ho appena capito. Sto ancora cercando di trovare una risposta migliore. Qualche idea? – bdeonovic

+0

Questo nuovo esempio non funziona perché stai passando un'espressione a 'clusterCall' piuttosto che a una funzione. Funzionerebbe con 'clusterEvalQ', ma avresti anche bisogno di esportare' simulate_fxns'. –

2

Utilizzando clusterEvalQ come modello, penso che vorrei realizzare un parallelo replicate come:

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) 

Gli argomenti simplify e USE.NAMES sono compatibili con anziché replicate, ma a mio parere costituiscono un involucro migliore attorno a parSapply.

Ecco un esempio derivato dalla pagina replicate man:

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