好吧,我认为没有人理解这个问题......
我有一个动态脚本。有时,它会遍历一个包含 10 个东西的列表,有时它只会遍历 1 个东西。
当要迭代的项目大于 1 时,我想使用foreach
并行运行脚本。我只想使用每个项目 1 个核心进行迭代。所以,如果有 5 件事情,我将跨 5 个线程并行。
我的问题是,当迭代列表为 1 时会发生什么?
不并行运行并让机器最大化吞吐量会更好吗?或者我可以让我的脚本分配 1 个工作人员,它的运行方式与我根本没有告诉它并行运行一样吗?
好吧,我认为没有人理解这个问题......
我有一个动态脚本。有时,它会遍历一个包含 10 个东西的列表,有时它只会遍历 1 个东西。
当要迭代的项目大于 1 时,我想使用foreach
并行运行脚本。我只想使用每个项目 1 个核心进行迭代。所以,如果有 5 件事情,我将跨 5 个线程并行。
我的问题是,当迭代列表为 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()
。但是与与一名工人并行相比,差异会很小。上面的修改代码为只有一名工人的情况添加了条件筛选。如果您需要进一步的帮助,请在下方提供反馈。