参考:https://zhuanlan.zhihu.com/p/24547984
https://blog.csdn.net/sinat_26917383/article/details/53349557
- 要传递一个变量,您将必须使用lapply或sapply类似的并行版本。但是,要传递许多变量,必须使用mapply或的并行版本Map。那会是clusterMap
单变量:x | 多变量:x,y,z | |
---|---|---|
串行计算 | lapply; sapply | mapply,do.call |
并行计算 | foreach 包 ;mclapply(Linux)或parlapply | foreach包;clusterMap |
1.并行计算--单变量x
函数
fun <- function(x){
return (x+1);
}
1.parallel包
library(parallel)
#detectCores函数可以告诉你你的CPU可使用的核数
detectCores()
r$> mc <- getOption("mc.cores", 3)
r$> system.time({
res <- mclapply(1:10000, fun, mc.cores = mc);
});
用户 系统 流逝
0.002 0.057 0.069
2.foreach包
#加载foreach,doParallel
library(foreach)
library(doParallel)
#下面这行代码相当于sapply
cl <- makeCluster(3)
registerDoParallel(cl)
system.time({x <- foreach(x=1:10000,.combine='rbind') %dopar% fun(x);})
stopCluster(cl)
用户 系统 流逝
2.136 0.159 2.361
2.多变量并行:x,y,z
fun2 <-function(x,y,z) {
x+y+z
}
1.clusterMap
fun2 <-function(x,y,z) {
x+y+z
}
# cluster <- makeCluster(detectCores())
cluster <- makeCluster(3)
clusterEvalQ(cluster, library(xts))
system.time({result <- clusterMap(cluster, fun2, x=1:1000, y=c(1:1000),z=5);})
df <- do.call('rbind', result)
用户 系统 流逝
0.173 0.045 0.725
2.foreach
library(doParallel)
cl <- makeCluster(3)
registerDoParallel(cl)
system.time({r <-foreach(x=1:1000, y=c(1:1000),z=rep(5, 1000),.combine='rbind') %dopar% {
x+y+z
};})
stopCluster(cl)
用户 系统 流逝
0.245 0.014 0.281
网友评论