使用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
我的机器(运行Win 7 Pro的相当现代的4核工作站)创建一个双节点集群大约需要4秒钟,创建一个四节点集群需要8秒钟。这让我觉得太慢,所以我在同事的同一台机器上尝试了相同的分析,两次测试分别花了一两秒钟。
这表示我可能在我的机器上设置了一些奇怪的配置,或者存在其他一些问题。我阅读了?makeCluster
和socketConnection
帮助页面,但没有看到任何与提高性能相关的内容。
在代码运行时,我查看了Windows任务管理器:没有明显的干扰反病毒或其他软件,只是一个Rscript进程运行在~17%(少于一个核心)。
我不知道在哪里找到问题的根源。在Windows下创建PSOCK群集是否有任何已知的缓慢原因?
创建4节点集群8秒实际上是否很慢(按2014标准),还是我的期望值太高?
答案 0 :(得分:14)
为了监控发生的事情,我安装并打开了Process Monitor(HT @qethanm)。我也退出系统托盘中的大部分内容,如Dropbox,以减少噪音。 (虽然最后,这并没有什么不同。)
然后我直接从R GUI(而不是IDE)重新运行问题中的R代码的简化版本。
microbenchmark(f(4), times = 5)
经过一番挖掘后,我注意到R GUI为它创建的每个集群产生了一个Rscript进程(见图)。
在经历了许多死胡同和疯狂追逐之后,我发现也许这些Rscript实例不是香草R.我重命名了我的Rprofile.site
文件以隐藏它并重复基准。
这一次,平均在不到一秒的时间内创建了一个4节点集群。
对于四节点群集,Rprofile.site
文件(可能是个人启动文件,~/.Rprofile
(如果存在)会被读取四次,这会大大减慢速度。将rscript_args = c("--no-init-file", "--no-site-file", "--no-environ")
传递给makeCluster
以避免此行为。