是什么影响使用并行包创建集群的时间?

Ric*_*ton 13 parallel-processing r

使用parallel软件包创建集群时,我遇到了缓慢的问题.

这是一个只使用n节点创建然后停止PSOCK群集的函数.

library(parallel)
library(microbenchmark)
f <- function(n)
{
  cl <- makeCluster(n)
  on.exit(stopCluster(cl))
}
microbenchmark(f(2), f(4), times = 10)
## Unit: seconds
##  expr      min       lq   median       uq      max neval
##  f(2) 4.095315 4.103224 4.206586 5.080307 5.991463    10
##  f(4) 8.150088 8.179489 8.391088 8.822470 9.226745    10   
Run Code Online (Sandbox Code Playgroud)

我的机器(一个运行Win 7 Pro的相当现代的4核工作站)创建一个双节点集群大约需要4秒钟,创建一个四节点集群需要8秒钟.这让我觉得太慢了,所以我在一个同事的同一台机器上尝试了同样的分析,两个测试分别花了一两秒钟.

这表明我可能在我的机器上设置了一些奇怪的配置,或者存在其他一些问题.我读了?makeClustersocketConnection帮助页面,但并没有看到有关提高性能的任何东西.

在代码运行时,我查看了Windows任务管理器:没有明显的干扰反病毒或其他软件,只是一个Rscript进程运行在~17%(少于一个核心).

我不知道在哪里找到问题的根源.在Windows下创建PSOCK群集是否有任何已知的缓慢原因?

8秒创建一个4节点集群实际上是否很慢(按2014标准),还是我的期望值太高?

Ric*_*ton 14

为了监控发生的事情,我安装并打开了Process Monitor(HT @qethanm).我也退出系统托盘中的大部分内容,如Dropbox,以减少噪音.(虽然最后,这没有什么区别.)

然后我直接从R GUI(而不是IDE)重新运行问题中的R代码的简化版本.

microbenchmark(f(4), times = 5)
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘后,我注意到R GUI为它创建的每个集群产生了一个Rscript进程(见图).

进程树显示每个集群中每个节点的Rscript实例

在经历了许多死胡同和疯狂的追逐之后,我想到也许这些Rscript实例不是香草R.我将我的Rprofile.site文件重命名为隐藏它并重复基准测试.

这次,平均在不到一秒的时间内创建了一个4节点集群.

对于四节点群集,该Rprofile.site文件(可能是个人启动文件~/.Rprofile,如果存在)会被读取四次,这会大大减慢速度.传递rscript_args = c("--no-init-file", "--no-site-file", "--no-environ")makeCluster避免这种行为.