如何在R的parallel包中使用mclapply来跟踪进度

5
我的问题与此问题有关。但上面提到的问题使用了已被parallel替换的multicore包。大部分回答中的函数无法在parallel包中复制。是否有一种方法可以跟踪mclapply的进度? 在查看mclapply文档时,有一个名为mc.silent的参数,我不确定是否能够跟踪进度,如果可以的话如何跟踪,并且我们可以在哪里看到日志文件? 我正在运行ubuntu linux操作系统。请参阅下面的可重现示例,我想要跟踪进度。
require(parallel) 

wait.then.square <- function(xx){
  # Wait for one second
  Sys.sleep(2);
  # Square the argument 
  xx^2 } 

output <- mclapply( 1:10, wait.then.square, mc.cores=4,mc.silent=FALSE)

非常感谢您的帮助。

2个回答

10

感谢软件包pbmcapply,现在您可以轻松跟踪mclapplymcmapply作业的进度。只需将mclapply替换为pbmclapply

wait.then.square <- function(xx) {
    Sys.sleep(2)
    xx^2 
} 

library(pbmcapply)
output <- pbmclapply(1:10, wait.then.square, mc.cores = 4)

...它将显示一个漂亮的进度条。

作者在这里有一篇关于技术细节和性能基准的不错博客文章。


非常感谢。我们知道pbmclapply在Windows上是否可用吗? - forecaster
mclapply通常在Windows上无法使用。在Windows上,pbapply包是一种跟踪进度但不进行并行处理的选择。我认为它不支持并行应用函数。 - thie1e

4

这是我相关答案的更新。

library(parallel)

finalResult <- local({
  f <- fifo(tempfile(), open="w+b", blocking=T)
  if (inherits(parallel:::mcfork(), "masterProcess")) {
    # Child
    progress <- 0.0
    while (progress < 1 && !isIncomplete(f)) {
      msg <- readBin(f, "double")
      progress <- progress + as.numeric(msg)
      cat(sprintf("Progress: %.2f%%\n", progress * 100))
    } 
    parallel:::mcexit()
  }
  numJobs <- 100
  result <- mclapply(1:numJobs, function(...) {
    # Do something fancy here... For this example, just sleep
    Sys.sleep(0.05)
    # Send progress update
    writeBin(1/numJobs, f)
    # Some arbitrary result
    sample(1000, 1)
  })
  close(f)
  result
})

cat("Done\n")

非常感谢 @fotNelton - forecaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接