【问题标题】:Showing progress_bar with doParallel + foreach使用 doParallel + foreach 显示 progress_bar
【发布时间】:2021-06-10 17:56:47
【问题描述】:

我正在使用here 发布的示例代码来显示progress_bar(来自progress 包)和doParallel + foreach。然而,那里的解决方案使用doSNOW(例如我用于测试的杜威布鲁克的代码),它比doParallel 更过时,并在构建带有 CRAN 标志的包时返回此注释:

使用被取代的包:'doSNOW (>= 1.0.19)'

改变这似乎并不像预期的那么简单。如果只有registerDoSNOWregisterDoParallel 替换,.options.snow.options.doparallel 替换,代码将运行,但在第二种情况下根本不会显示任何进度条。

我认为这可能与.options.X 的使用有关。这部分代码对我来说非常模糊,因为.options.snow 在使用doSNOW 时确实有效,但是没有关于使用此参数的foreach 手册页的文档。因此,.options.doparallel 不起作用也就不足为奇了,因为这只是我的一个疯狂猜测。

foreach 循环中包含对pb$tick() 的调用也不起作用,实际上会导致结果错误。所以我真的不知道应该在代码中的哪个位置包含它。

.options.snow 来自哪里? pb$tick()应该去哪里,如何在这里使用doParallel显示progress_bar对象?

为方便起见,我粘贴在代码下方(doSNOW 替换为doParallel),但再次注明original source

library(parallel)
library(doParallel)

numCores<-detectCores()
cl <- makeCluster(numCores)
registerDoParallel(cl)

# progress bar ------------------------------------------------------------
library(progress)

iterations <- 100                               # used for the foreach loop  

pb <- progress_bar$new(
  format = "letter = :letter [:bar] :elapsed | eta: :eta",
  total = iterations,    # 100 
  width = 60)

progress_letter <- rep(LETTERS[1:10], 10)  # token reported in progress bar

# allowing progress bar to be used in foreach -----------------------------
progress <- function(n){
  pb$tick(tokens = list(letter = progress_letter[n]))
} 

opts <- list(progress = progress)

# foreach loop ------------------------------------------------------------
library(foreach)

foreach(i = 1:iterations, .combine = rbind, .options.doparallel = opts) %dopar% {
  summary(rnorm(1e6))[3]
}

stopCluster(cl) 

【问题讨论】:

  • 你好@elcortegano,你解决过这个问题吗?
  • 不,很遗憾。并且还没有找到doSNOW 的替代品来完成这项任务。

标签: r foreach progress-bar doparallel


【解决方案1】:

doParallel 仍然使用.options.snow 参数,无论出于何种原因。在doParallel documentation 中发现了这个小花絮。

doParallel 后端支持通过 foreach 函数传递的多核和雪选项。支持的多核选项是第一个prescheduleset.seedsilentcores,它们类似于mclapply 的类似名称参数,并使用.options.multicore 参数传递给foreach。支持的 snow 选项是 preschedule,就像它的多核模拟一样,可用于分块任务,以便每个工作人员获得预先安排的任务块,以及 attachExportEnv,可用于在某些情况下附加导出环境R 的词法作用域无法找到所需的导出。使用 .options.snow 参数将雪选项传递给 foreach。

foreach 是一个强大的软件包,但维护它的人会做出奇怪的决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2020-06-07
    • 2017-09-04
    • 2021-09-16
    • 2015-08-31
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多