R foreach doParallel有1个worker / thread

时间:2017-01-20 22:31:02

标签: r multithreading foreach doparallel

好吧,我不认为有人理解这个问题......

我有一个动态脚本。有时,它会遍历10个事物的列表,有时它只会迭代1个事物。

当要迭代的项大于1时,我想使用foreach并行运行脚本。我只想每个项目使用1个核心来迭代。所以,如果有5件事,我会在5个线程中并行。

我的问题是,当迭代列表是1时会发生什么?

最好不并行运行并让机器最大化吞吐量?或者我可以让我的脚本分配1个工作程序,它会像我没有告诉它并行运行一样运行吗?

1 个答案:

答案 0 :(得分:1)

因此,我们称之为"您正在迭代的事物的数量"您可以为不同流程动态设置的iter

编写并行化脚本可能看起来像这样

if(length(iter)==1){
  Result <- #some function
} else {
  cl <- makeCluster(iter)
  registerDoParallel(cl)
  Result <- foreach(z=1:iter) %dopar% {
    # some function 
  }
  stopCluster(cl)
}

如果iter为1,则不会调用并行化,否则将根据iter的数量动态分配核心。请注意,如果您打算将其嵌入到函数中,则无法在函数内调用makeClusterregisterDoParallel,您必须将它们设置在函数外部。

或者,您可以注册与节点一样多的群集,动态运行foreach,未使用的群集将保持空闲状态。

编辑:如果只有一个迭代操作,最好运行NOT并行运行。如果只是为了避免makeCluster()registerDoParallel()stopCluster()产生额外的时间。但与一个工人并行相比,差异会很小。上面的修改代码为仅一个工人的情况添加条件屏幕。如果您需要进一步的帮助,请在下面提供反馈。