gpt4 book ai didi

r - R foreach 循环中的负载平衡

转载 作者:行者123 更新时间:2023-12-02 09:20:55 25 4
gpt4 key购买 nike

有没有办法修改 R foreach 循环如何与 doParallel 后端进行负载平衡?当并行执行执行时间差异很大的任务时,可能会发生所有节点但其中一个节点已完成其任务,而最后一个节点仍有多个任务要做的情况。这是一个玩具示例:

library(foreach)
library(doParallel)

registerDoParallel(4)

waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1)

w = iter(waittime)

foreach(i=w) %dopar% {
message(paste("waiting",i, "on",Sys.getpid()))
Sys.sleep(i)
}

基本上,代码注册了4个核心。对于每个循环 i ,任务是等待 waittime[i] 秒。但是,由于 foreach 循环中的负载平衡默认情况下似乎是将任务总数拆分为长度为已注册核心数的集合,因此在上面的示例中,第一个核心接收所有带有 waittime 的任务= 10,而其他 3 个内核接收 waittime = 1 的任务,以便这 3 个内核将在第一个内核完成其第一个任务之前完成所有任务。

有没有办法让foreach()一次分配一个任务?即在上述情况下,我希望前 4 个任务分布在 4 个核心之间,然后将每个下一个任务分布到下一个可用核心。

谢谢。

最佳答案

我自己没有测试过,但是doParallel后端提供了preschedule类似于 mc.preschedule 的选项mclapply() 中的参数。 (请参阅 doParallel vignette 的第 7 节。)

你可以尝试:

mcoptions <- list(preschedule = FALSE)
foreach(i = w, .options.multicore = mcoptions)

关于r - R foreach 循环中的负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com