r - 是否可以使用 foreach 和后端 "multicore-kind"获得进度条

标签 r progress-bar parallel-foreach domc

使用“多核”并行性时使用 foreachdoMC后端(我使用 doMC,因为在我查看它时其他软件包不允许从我想使用 progress 软件包获得进度条,但任何进度(在 Linux 终端上工作,即没有 tcltk弹出窗口)可以做到。

鉴于它使用 fork ,我可以想象这可能是不可能的,但我不确定。

预期用途是在我并行加载 100 个串联文件时指示进度(通常在 #!Rscript 内)

我看过一些帖子,例如 How do you create a progress bar when using the “foreach()” function in R? 。很高兴对此给予赏金。

编辑

向向我展示如何操作的人提供 500 点奖励

  1. 使用 foreach 和多核( fork )类型的并行性
  2. 获取进度条
  3. 使用futile.logger获取日志记录

Reprex

# load packages                                                                                                        
library("futile.logger")                                                                                               
library("data.table")                                                                                                  
library("foreach")                                                                                                     
# create temp dir                                                                                                      
tmp_dir <- tempdir()                                                                                                   
# create names for 200 files to be created                                                                             
nb_files <- 200L                                                                                                       
file_names <- file.path(tmp_dir, sprintf("file_%s.txt", 1:nb_files))                                                   
# make it reproducible                                                                                                 
set.seed(1L)                                                                                                           
nb_rows <- 1000L                                                                                                       
nb_columns <- 10L                                                                                                      
# create those 200 files sequentially                                                                                  
foreach(file_i = file_names) %do%                                                                                      
{                                                                                                                      
    DT <- as.data.table(matrix(data = runif(n = nb_rows * nb_columns), nrow = nb_rows))                                
    fwrite(x = DT, file = file_i)                                                                                      
    flog.info("Creating file %s", file_i)                                                                              
} -> tmp                                                                                                               

# Load back the files                                                                                                  
foreach(file_i = file_names, .final = rbindlist) %dopar%                                                               
{                                                                                                                      
    flog.info("Loading file %s", file_i)                                                                               
    # >>> SOME PROGRESS BAR HERE <<<                                                                                   
    fread(file_i)                                                                                                      
} -> final_data                                                                                                        
# show data                                                                                                            
final_data                                                                                                             

所需输出

请注意,进度条没有与打印行混淆)

INFO [2018-07-18 19:03:48] Loading file /tmp/RtmpB13Tko/file_197.txt
INFO [2018-07-18 19:03:48] Loading file /tmp/RtmpB13Tko/file_198.txt
INFO [2018-07-18 19:03:48] Loading file /tmp/RtmpB13Tko/file_199.txt
INFO [2018-07-18 19:03:48] Loading file /tmp/RtmpB13Tko/file_200.txt
[ =======>                          ] 4% 

编辑 2

赏金结束后,没有任何结果接近预期的结果。

在进度条内记录会搞乱一切。 如果有人得到正确的结果,我将根据结果再给予赏金。

最佳答案

这是使用自定义函数的解决方案(并不完美)。

此函数输出到控制台(使用消息)进度条。

  • ii 是当前迭代。
  • N 是要执行的迭代总数。
  • per 是更新进度条的步骤(百分比)。我们需要这个,因为当执行多次迭代时进度条更新太频繁并且输出困惑。

功能:

progBar <- function(ii, N, per = 10) {
    if (ii %in% seq(1, N, per)) {
        x <- round(ii * 100 / N)
        message("[ ", 
                paste(rep("=", x), collapse = ""),
                paste(rep("-", 100 - x), collapse = ""), 
                " ] ", x, "%", "\r",
                appendLF = FALSE)
        if (ii == N) cat("\r")
    }
}

要测试的代码:

library(doMC)
library(foreach)
registerDoMC(10)

nIteration <- 1e3
foreach(i = 1:nIteration, ii = icount()) %dopar% {
    # For progBar ii I'm using icount(), because
    # user might iterate over all kind of objects
    progBar(ii, nIteration)
    Sys.sleep(1 / 10)
}

enter image description here

PS:它并不完美,因为:

  • Bar 并不总是运行到 100%(取决于它可以停止在 99% 的迭代次数)
  • 有时输出会困惑(取决于迭代次数和切换频率) - 仍在调试这部分
  • 如果您在 foreach 中使用 print/cat,控制台不会刷新

关于r - 是否可以使用 foreach 和后端 "multicore-kind"获得进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51213293/

相关文章:

用 gsub 替换除某些字符串之外的字符

r - 按 2 组汇总数据

intellij-idea - 标准输出进度条在 Pycharm 中不起作用

r - R中的平行k均值

具有异步任务和相关后异步任务的 C# ForEach 循环

r - 是否可以在 R 中使用类似字典的对象将一个字符串映射到另一个字符串?

regex - 在 R 中删除标点符号和数字文本挖掘后如何在 2 个单词之间留出空格

android - 静态圆形进度指示器

android - 进度条随 int 值变化