R foreach doParallel with 1 worker/thread

R foreach doParallel with 1 worker/thread

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

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

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

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

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

所以让我们调用 "the number of things you are iterating" 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的个数动态分配核心。注意,如果你打算把this嵌入到一个函数中,makeClusterregisterDoParallel不能在函数内调用,你必须在函数外设置它们。

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

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