Простейший способ сделать параллельный репликат
Я увлекаюсь пакетом parallel
в R и насколько простым и интуитивным он выполняет параллельные версии apply
, sapply
и т.д.
Существует ли аналогичная параллельная функция для replicate
?
Ответы
Ответ 1
Вы можете просто использовать параллельные версии lapply
или sapply
вместо того, чтобы говорить, чтобы реплицировать это выражение 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) } )
Ответ 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)
Аргументы simplify
и USE.NAMES
совместимы с sapply
, а не replicate
, но, по моему мнению, они делают лучшую оболочку вокруг parSapply
.
Вот пример, полученный на странице replicate
man:
library(parallel)
cl <- makePSOCKcluster(3)
hist(parReplicate(cl, 100, mean(rexp(10))))
Ответ 3
Это лучшее, что я мог придумать:
cl <- makeCluster(getOption("cl.cores", 4))
clusterCall(cl, replicate(50, simulate_fxns() ))
stopCluster(cl)