parSapply和进度条

时间:2016-07-05 09:20:03

标签: r parallel-processing apply

我正在使用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。

1 个答案:

答案 0 :(得分:1)

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那么好。