parSapply 和进度条

parSapply and progress bar

我正在使用函数 parSapply 运行 在并行环境中进行模拟。这是我的代码:

runpar <- function(i) MonteCarloKfun(i=i)

# Detect number of cores available
ncores <- detectCores(logical=TRUE)

# Set up parallel environment
cl <- makeCluster(ncores, methods=FALSE)

# Export objects to parallel environment
clusterSetRNGStream(cl,1234567) # not necessary since we do not sample
clusterExport(cl, c("kfunctions","frq","dvec","case","control","polygon", "MonteCarloKfun", "khat", 
                    "as.points", "secal"))

# For 1 parameter use parSapply
outpar <- parSapply(cl,i,runpar)

# close parallel environment
stopCluster(cl)

有谁知道是否可以在 parSapply 函数中添加进度条。理想情况下,我想要类似于 pbapply 库的 pbapply 的东西。

parSapply函数不支持进度条,我认为没有什么真正好的方法可以通过在任务函数中添加额外的代码来实现,尽管人们已经做出了很大的努力这样做。

doSNOW 包支持进度条,因此您可以直接使用它或编写一个类似于 parSapply 函数的包装函数。这是编写此类包装函数的一种方法:

# This function is similar to "parSapply", but doesn't preschedule
# tasks and doesn't support "simplify" and "USE.NAMES" options
pbSapply <- function(cl, X, FUN, ...) {
  registerDoSNOW(cl)
  pb <- txtProgressBar(max=length(X))
  on.exit(close(pb))
  progress <- function(n) setTxtProgressBar(pb, n)
  opts <- list(progress=progress)
  foreach(i=X, .combine='c', .options.snow=opts) %dopar% {
    FUN(i, ...)
  }
}

您可以轻松修改此函数以使用 tkProgressBarwinProgressBar 函数。

下面是 pbSapply 的使用示例:

library(doSNOW)
cl <- makeSOCKcluster(3)
x <- pbSapply(cl, 1:100, function(i, j) {Sys.sleep(1); i + j}, 100)

请注意,这不使用预调度,因此如果您有小任务,性能将不如 parSapply