R中关于doParallel
函数的doMC
和foreach
之间有什么区别? doParallel
支持windows,unix-like,而doMC
仅支持unix-like。换句话说,为什么doParallel
无法直接替换doMC
?谢谢。
更新:
doParallel
构建于parallel
,基本上是multicore
和snow
的合并,并自动为您的系统使用适当的工具。因此,我们可以使用doParallel
来支持多系统。换句话说,我们可以使用doParallel
来替换doMC
。
参考:http://michaeljkoontz.weebly.com/uploads/1/9/9/4/19940979/parallel.pdf
BTW,registerDoParallel(ncores=3)
和
cl <- makeCluster(3)
registerDoParallel(cl)
似乎registerDoParallel(ncores=3)
可以自动停止群集,而第二个不会自动停止并且需要stopCluster(cl)
。
参考:http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
答案 0 :(得分:27)
doParallel
包是doSNOW
和doMC
的合并,而parallel
是snow
和multicore
的合并。但是虽然doParallel
具有doMC
的所有功能,但我从Rich Calaway的革命分析中得知,他们希望保留doMC
,因为它在某些情况下效率更高,即使{ {1}}现在使用doMC
就像parallel
一样。我没有亲自运行任何基准来确定是否以及何时存在显着差异。
我倾向于在Linux或Mac OS X计算机上使用doParallel
,在Windows计算机上使用doMC
,在Linux群集上使用doParallel
,但doMPI
确实有效在所有这些平台上。
对于不同的注册方法,如果执行:
doParallel
在Windows机器上,它将隐式创建一个集群对象,以便以后与registerDoParallel(cores=3)
一起使用,而在Linux和Mac OS X上,不会创建或使用集群对象。只需记住核心数量,并在调用clusterApplyLB
后将其用作mc.cores
参数的值。
如果您执行:
mclapply
然后,无论平台如何,注册的群集对象都将与cl <- makeCluster(3)
registerDoParallel(cl)
一起使用。你是对的,在这种情况下,你有责任在创建集群对象后关闭它,而隐式集群对象会自动关闭。