0

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

我有一个动态脚本。有时,它会遍历一个包含 10 个东西的列表,有时它只会遍历 1 个东西。

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

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

不并行运行并让机器最大化吞吐量会更好吗?或者我可以让我的脚本分配 1 个工作人员,它的运行方式与我根本没有告诉它并行运行一样吗?

4

1 回答 1

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. 请注意,如果您打算将其嵌入函数中,makeCluster并且registerDoParallel不能在函数内调用,则必须将它们设置在函数外。

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

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

于 2017-01-21T06:14:01.260 回答