最简单的并行复制方法

时间:2013-10-09 19:35:49

标签: r parallel-processing

我喜欢R中的parallel软件包以及applysapply等并行版本的简单直观性。

replicate是否有类似的并行功能?

4 个答案:

答案 0 :(得分:27)

您可以使用lapplysapply的并行版本,而不是说要复制此表达式n次,而不是在1:n申请表达式,将该表达式包装在忽略发送给它的参数的函数中。

可能是这样的:

#create cluster
library(parallel)
cl <- makeCluster(detectCores()-1)  
# get library support needed to run the code
clusterEvalQ(cl,library(MASS))
# put objects in place that might be needed for the code
myData <- data.frame(x=1:10, y=rnorm(10))
clusterExport(cl,c("myData"))
# Set a different seed on each member of the cluster (just in case)
clusterSetRNGStream(cl)
#... 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) } )

答案 1 :(得分: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)

参数simplifyUSE.NAMESsapply而不是replicate兼容,但在我看来,它们使parSapply成为更好的包装器。< / p>

以下是从replicate手册页派生的示例:

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

答案 2 :(得分:0)

future.apply 包为 replicate() 提供了一个插件替代品,它并行运行并使用开箱即用的统计声音并行随机数生成:

library(future.apply)
plan(multisession, workers = 4)

y <- future_replicate(100, mean(rexp(10)))

答案 3 :(得分:-1)

这是我能想到的最好的:

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