假设我想在R中做一些通常(在一个进程/线程中)看起来像这样的东西:
for(i in 1:2) {
for(j in 1:2) {
#Do some stuff here
}
}
在四核机器上使用R的新包并行,我可以执行以下操作吗?
cluster<-makeCluster(4)
innerLoop<-function() {
#Do some stuff here
}
outerLoop<-function() {
result<-do.call(, parLapply(cluster, c(1:2), innerLoop))
}
final.result<-do.call(, parLapply(cluster, c(1:2), outerLoop))
这是否可以使用R-2.14.0附带的并行包?
答案 0 :(得分:10)
是的,你可以这样做。对于第一级并行化,您必须使用分布式内存技术(如雪包中的makeCluster()),在第二级并行化中,您必须使用共享内存技术(多核包,mclapply())。
这是一个简单的代码示例:
library(parallel)
cl <- makeCluster(2)
inner <- function(x){
pid <- Sys.getpid()
name <- Sys.info()["nodename"]
str <- paste("This is R running on", name, "with PID", pid, "!")
return(str)
}
outer <- function(x, cores, funceval){
require(parallel)
mclapply(1:cores, funceval)
}
parLapply(cl, 1:length(cl), outer, 2, inner)
在输出中,您应该看到不同的机器名称和不同的PID!