R语言 如何跟踪并行化循环的每个示例中的进度?

cu6pst1q  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在并行运行多个MCMC。如何跟踪每个MCMC的进度?我不是问如何跟踪并行循环的进度,即每个MCMC何时完成;相反,我想知道嵌套在并行循环中的每个MCMC的进度。有没有办法设置多个进度条?或者我需要在嵌套的循环中保存一些文件来监视?

#not executed so not sure if actually reprex, but the concept is there
#computer is still running my other code :)
library(foreach)
library(doParallel)

cl <- makeCluster(mc <- getOption("cl.cores", parallel::detectCores()))

registerDoParallel(cl)

reprex <- foreach(1:10) %dopar% { 
  for(ii in 1:100){
    #I want to track this loop's progress within each instance
    Sys.sleep(0.1)
  } 
}

stopCluster(cl)
csbfibhn

csbfibhn1#

当然,在R中没有对多个进度条的一般支持,至少在R控制台中没有跨多行的支持。
除此之外,futureversedoFutureprogressr可以为您提供近乎实时的进度更新。要点如下:

library(foreach)
library(doFuture)
library(progressr)

## Report on progress automatically
handlers(global = TRUE)

## Parallelize on local machine
plan(multisession)

## See https://progressr.futureverse.org/#a-progressor-cannot-be-created-in-the-global-environment
## for why we use local() here
reprex <- local({
  p <- progressor(steps = 10 * 100)
  y <- foreach(hh = 1:10) %dofuture% { 
    for(ii in 1:100){
      Sys.sleep(0.1)
      ## Report on progress thus far with a custom message
      p(sprintf("(hh, ii) = (%d, %d)", hh, ii))
    } 
  }
  y
})

## Stop local cluster
plan(sequential)
fnvucqvd

fnvucqvd2#

谢谢你的代码,它帮助了很多。
我发现的一个额外的特性是,通过设置class =“sticky”,我可以打印链的一些值,并且它们保留在控制台中。

p(sprintf("precision %.*f, width '%*.3f'", 3, pi, 8, pi), class =  "sticky")

相关问题