Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中不等任务和进度条的最优负载平衡_R_Performance_Optimization_Parallel Processing_Load Balancing - Fatal编程技术网

R中不等任务和进度条的最优负载平衡

R中不等任务和进度条的最优负载平衡,r,performance,optimization,parallel-processing,load-balancing,R,Performance,Optimization,Parallel Processing,Load Balancing,我有N个任务,我希望在R中的M个核之间并行。这些任务在执行所需的时间上有很大差异。幸运的是,我大致了解了哪些任务会比较慢,哪些任务会比较快。我还有一个进度条,它根据完成的任务数量递增 我希望优化任务的顺序,以便: 总计算时间被最小化 进度条代表剩余的时间,而不是剩余的任务 举一个更实际的例子: do_task <- function(x){ Sys.sleep(x ** 2) } tasks <- 1:10 cl <- parallel::makeCluster(4)

我有N个任务,我希望在R中的M个核之间并行。这些任务在执行所需的时间上有很大差异。幸运的是,我大致了解了哪些任务会比较慢,哪些任务会比较快。我还有一个进度条,它根据完成的任务数量递增

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

  • 总计算时间被最小化
  • 进度条代表剩余的时间,而不是剩余的任务
  • 举一个更实际的例子:

    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)
    
    do_task进一步研究发现

    这表明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)
    
    pb进一步研究发现

    这表明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)
    

    pb如果你对时间的估计是好的,那么按时间递减排序总是最快的。如果你对时间的估计是好的,那么按时间递减排序总是最快的。
    
    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)