【问题标题】:How to show the progress of code in parallel computation in R?如何在 R 中显示并行计算中的代码进度?
【发布时间】:2016-11-18 19:32:20
【问题描述】:

我现在正在处理一个大型数据集,某些函数可能需要数小时才能处理。我想知道如何通过进度条或数字(1,2,3,...,100)显示代码的进度。我想将结果存储为具有两列的数据框。这是一个例子。谢谢。

require(foreach)
require(doParallel)
require(Kendall)

cores=detectCores()
cl <- makeCluster(cores-1)
registerDoParallel(cl)

mydata=matrix(rnorm(8000*500),ncol = 500)
result=as.data.frame(matrix(nrow = 8000,ncol = 2))
pb <- txtProgressBar(min = 1, max = 8000, style = 3)

foreach(i=1:8000,.packages = "Kendall",.combine = rbind) %dopar%         
{
  abc=MannKendall(mydata[i,])
  result[i,1]=abc$tau
  result[i,2]=abc$sl
  setTxtProgressBar(pb, i)
}
close(pb)
stopCluster(cl)

但是,当我运行代码时,我没有看到任何进度条出现并且结果不正确。有什么建议吗?谢谢。

【问题讨论】:

    标签: r parallel-processing progress-bar


    【解决方案1】:

    doSNOW 包支持进度条,而 doParallel 不支持。这是在示例中放置进度条的一种方法:

    require(doSNOW)
    require(Kendall)
    cores <- parallel::detectCores()
    cl <- makeSOCKcluster(cores)
    registerDoSNOW(cl)
    mydata <- matrix(rnorm(8000*500), ncol=500)
    pb <- txtProgressBar(min=1, max=8000, style=3)
    progress <- function(n) setTxtProgressBar(pb, n)
    opts <- list(progress=progress)
    result <- 
      foreach(i=1:8000, .packages="Kendall", .options.snow=opts,
              .combine='rbind') %dopar% {
        abc <- MannKendall(mydata[i,])
        data.frame(tau=abc$tau, sl=abc$sl)
      }
    close(pb)
    stopCluster(cl)
    

    【讨论】:

    【解决方案2】:

    我认为pbapply 包也可以完成这项工作。

    require(parallel)
    require(pbapply)
    
    mydata=matrix(rnorm(8000*500),ncol = 500)
    
    cores=detectCores()
    cl <- makeCluster(cores-1)
    parallel::clusterExport(cl= cl,varlist = c("mydata"))
    parallel::clusterEvalQ(cl= cl,library(Kendall))
    
    result = pblapply(cl = cl,
             X = 1:8000,
             FUN = function(i){
      abc=MannKendall(mydata[i,])
      result = as.data.frame(matrix(nrow = 1,ncol = 2))
      result[1,1]=abc$tau
      result[1,2]=abc$sl
      return(result)
    })
    
    result = dplyr::bind_rows(result)
    stopCluster(cl)
    

    根据文档,如果通过cl 提供套接字集群,那么它会调用parLapply()

    可以通过 cl 参数启用并行处理。当 cl 为 a 时调用 parLapply 'cluster' 对象,当 cl 为整数时调用 mclapply。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多