gpt4 book ai didi

r - 使用 doParallel + foreach 显示 progress_bar

转载 作者:行者123 更新时间:2023-12-05 04:52:04 29 4
gpt4 key购买 nike

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

Uses the superseded package: ‘doSNOW (>= 1.0.19)’

Change this 似乎并没有想象的那么简单。如果仅将 registerDoSNOW 替换为 registerDoParallel,并将 .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)

最佳答案

doParallel 出于任何原因仍然使用 .options.snow 参数。在 doParallel documentation 中找到了这个小花絮.

The doParallel backend supports both multicore and snow options passed through the foreach function. The supported multicore options are 1st preschedule, set.seed, silent, and cores, which are analogous to the similarly named arguments to mclapply, and are passed using the .options.multicore argument to foreach. The supported snow options are preschedule, which like its multicore analog can be used to chunk the tasks so that each worker gets a prescheduled chunk of tasks, and attachExportEnv, which can be used to attach the export environment in certain cases where R’s lexical scoping is unable to find a needed export. The snow options are passed to foreach using the .options.snow argument.

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


编辑

doParallel 不支持 progress 多核选项。因此,如果使用 registerDoParallel 而不是 registerDoSNOW,则进度条将不会显示

虽然 doSNOW 已被取代,但尚不清楚是否一个比另一个更过时,因为两者都经历了很少的变化,而不是更新当前的 Maintainer ( doParallel | doSNOW )。

做雪

doSNOW:::doSNOW <- function (obj, expr, envir, data) 
{
cl <- data
preschedule <- FALSE
attachExportEnv <- FALSE
progressWrapper <- function(...) NULL # <- CRITICAL DIFFERENCE
if (!inherits(obj, "foreach"))
stop("obj must be a foreach object")
it <- iter(obj)
accumulator <- makeAccum(it)
options <- obj$options$snow
if (!is.null(options)) {
nms <- names(options)
recog <- nms %in% c("preschedule", "attachExportEnv",
"progress") # <- CRITICAL DIFFERENCE
if (any(!recog))
warning(sprintf("ignoring unrecognized snow option(s): %s",
paste(nms[!recog], collapse = ", ")), call. = FALSE)
...

做并行


doParallel:::doParallelSNOW <- function (obj, expr, envir, data)
{
cl <- data
preschedule <- FALSE
attachExportEnv <- FALSE
# MISSING: progressWrapper <- function(...) NULL
if (!inherits(obj, "foreach"))
stop("obj must be a foreach object")
it <- iter(obj)
accumulator <- makeAccum(it)
options <- obj$options$snow
if (!is.null(options)) {
nms <- names(options)
recog <- nms %in% c("preschedule", "attachExportEnv" #MISSING , "progress")
if (any(!recog))
warning(sprintf("ignoring unrecognized snow option(s): %s",
paste(nms[!recog], collapse = ", ")), call. = FALSE)
...

关于r - 使用 doParallel + foreach 显示 progress_bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66604588/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com