好吧,我不认为有人理解这个问题......
我有一个动态脚本。有时,它会遍历10个事物的列表,有时它只会迭代1个事物。
当要迭代的项大于1时,我想使用foreach
并行运行脚本。我只想每个项目使用1个核心来迭代。所以,如果有5件事,我会在5个线程中并行。
我的问题是,当迭代列表是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
的数量动态分配核心。请注意,如果您打算将其嵌入到函数中,则无法在函数内调用makeCluster
和registerDoParallel
,您必须将它们设置在函数外部。
或者,您可以注册与节点一样多的群集,动态运行foreach
,未使用的群集将保持空闲状态。
编辑:如果只有一个迭代操作,最好运行NOT并行运行。如果只是为了避免makeCluster()
,registerDoParallel()
和stopCluster()
产生额外的时间。但与一个工人并行相比,差异会很小。上面的修改代码为仅一个工人的情况添加条件屏幕。如果您需要进一步的帮助,请在下面提供反馈。