jestem lubiący pakietu w R parallel
i jak łatwe i intuicyjne jest to zrobić równoległe wersje apply
, sapply
itpNajprostszy sposób to zrobić równoległego Replicate
Czy istnieje podobna funkcja równolegle do replicate
?
jestem lubiący pakietu w R parallel
i jak łatwe i intuicyjne jest to zrobić równoległe wersje apply
, sapply
itpNajprostszy sposób to zrobić równoległego Replicate
Czy istnieje podobna funkcja równolegle do replicate
?
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) })
To jest najlepsze co mogłem wymyślić:
cl <- makeCluster(getOption("cl.cores", 4))
clusterCall(cl, replicate(50, simulate_fxns()))
stopCluster(cl)
'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". –
Tak, właśnie to sobie uświadomiłem. Nadal próbuję znaleźć lepszą odpowiedź. Jakieś pomysły? – bdeonovic
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'. –
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))))
Dzięki, właśnie to zrobiłem, gdy przeczytałem, że replikacja była tylko opakowaniem dla sapply. – bdeonovic