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嵌入到一个函数中,makeCluster
和registerDoParallel
不能在函数内调用,你必须在函数外设置它们。
或者,您可以注册与节点一样多的集群,运行 foreach
是动态的,未使用的集群将保持空闲状态。
编辑: 如果您只有一个操作要迭代,最好 运行 不要 运行 并行。如果只是为了避免 makeCluster()
、registerDoParallel()
和 stopCluster()
招致的额外时间。但与与一名工人并行相比,差异会很小。修改后的代码在只有一名工人的情况下添加了条件筛选。如果您需要进一步的帮助,请在下面提供反馈。
嗯,我认为没有人理解这个问题...
我有一个动态脚本。有时,它会遍历一个包含 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嵌入到一个函数中,makeCluster
和registerDoParallel
不能在函数内调用,你必须在函数外设置它们。
或者,您可以注册与节点一样多的集群,运行 foreach
是动态的,未使用的集群将保持空闲状态。
编辑: 如果您只有一个操作要迭代,最好 运行 不要 运行 并行。如果只是为了避免 makeCluster()
、registerDoParallel()
和 stopCluster()
招致的额外时间。但与与一名工人并行相比,差异会很小。修改后的代码在只有一名工人的情况下添加了条件筛选。如果您需要进一步的帮助,请在下面提供反馈。