【问题标题】:parSapply and progress barparSapply 和进度条
【发布时间】:2016-07-05 09:20:02
【问题描述】:

我正在使用函数 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 的东西。

【问题讨论】:

标签: r parallel-processing apply


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2014-06-06
    • 2011-12-21
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多