2013-10-09 6 views

Odpowiedz

24

można po prostu użyć równoległe wersje lapply lub sapply, zamiast mówić do replikacji tego wyrażenia n razy wykonaj stosować na 1:n i zamiast wyrażenia, zawijasz to wyrażenie w funkcji, która ignoruje wysłany do niego argument.

ewentualnie coś takiego:

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

jako równoległego odpowiednika:

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

Dzięki, właśnie to zrobiłem, gdy przeczytałem, że replikacja była tylko opakowaniem dla sapply. – bdeonovic

-1

To jest najlepsze co mogłem wymyślić:

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

'clusterCall' wykonuje funkcję raz dla każdego pracownika w klastrze, wracając listę z tym wiele elementów. To nie wydaje mi się zbyt podobne do "replikacji". –

+0

Tak, właśnie to sobie uświadomiłem. Nadal próbuję znaleźć lepszą odpowiedź. Jakieś pomysły? – bdeonovic

+0

Ten nowy przykład nie działa, ponieważ przekazujesz wyrażenie do 'clusterCall' zamiast funkcji. Będzie działać z 'clusterEvalQ', ale musisz także wyeksportować' simulate_fxns'. –

2

Korzystanie clusterEvalQ jako model, myślę, że będzie realizować równolegle replicate jak:

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) 

Argumenty simplify i USE.NAMES są kompatybilne z sapply, a nie replicate, ale w mojej opinii są one lepszym opakowaniem około parSapply.

Oto przykład pochodzi ze strony replicate człowieka:

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