Подтвердить что ты не робот

Простейший способ сделать параллельный репликат

Я увлекаюсь пакетом parallel в R и насколько простым и интуитивным он выполняет параллельные версии apply, sapply и т.д.

Существует ли аналогичная параллельная функция для replicate?

4b9b3361

Ответ 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)