R

我有N个任务,希望在R中的M个内核之间并行化。这些任务执行所需的时间差异很大。幸运的是,我粗略地指出了哪些任务将很慢,哪些任务将很快。我还有一个进度条,它以完成的任务数递增。

我想优化任务的顺序,以便:

  1. 总计算时间最小化
  2. 进度条代表剩余时间,而不是剩余任务。

举一个更实际的例子:

do_task <- function(x){
  Sys.sleep(x ** 2)
}

tasks <- 1:10

cl <- parallel::makecluster(4)
pbapply::pboptions(use_lb = TRUE)
pbapply::pblapply(tasks,do_task,cl = cl)
parallel::stopCluster(cl)
rm(cl)

总处理时间为6分32秒,进度条开始时移动很快,但是随着任务花费的时间越来越长,其移动速度非常慢。

或从最长到最短:

tasks <- 10:1

这需要2分20秒,因此要快得多。但是进度条开始时非常缓慢,然后突然加速。

我还尝试了交错任务。

tasks <- c(10,1,9,2,8,3,7,4,6,5)

这需要3分20秒,不是最快的时间,但是确实提供了更加平衡的进度条。

kangzilong 回答:R

更多研究发现this

这表明pbapply中的负载平衡很差。他们举了一个我改编的例子

pb <- utils::txtProgressBar(max = 10,style = 3)
progress <- function(n) utils::setTxtProgressBar(pb,n)
opts <- list(progress = progress)
cl <- parallel::makeCluster(4)
doSNOW::registerDoSNOW(cl)
boot <- foreach::foreach(i = tasks,.options.snow = opts)
res_all <- foreach::`%dopar%`(boot,do_task(i))
parallel::stopCluster(cl)

此运行时间为105秒,接近100秒的最佳时间,并且比我发现的任何其他方法都要好得多。进度栏仍然高度不平衡,但至少速度很快。

本文链接:https://www.f2er.com/3150082.html

大家都在问