12

foreachdoMCバックエンドを使用して「マルチコア」並列処理を使用している間(調べた時点で doMC を使用しているため、他のパッケージではログを記録できませんでした。進行状況パッケージを使用して進行状況バーを取得したいのですが、進行状況 (これは Linux 端末で動作します (つまり、tcltk ポップアップはありません)。

フォークを使用していることを考えると、不可能かもしれないと想像できますが、よくわかりません。

使用目的は、連結された数百のファイルを並行してロードするときの進行状況を示すことです (通常は #!Rscript 内)。

R で「foreach()」関数を使用するときにプログレス バーを作成するにはどうすればよいですか?のようないくつかの投稿を見てきました。. これに報奨金を授与できてうれしいです。

編集

方法を教えてくれた人に 500 ポイントの報奨金を提供

  1. foreach とマルチコア (フォーク) タイプの並列処理を使用する
  2. プログレスバーを取得する
  3. futile.logger を使用してログを取得する

リプレックス

# 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

報奨金が終了した後、期待される結果に近づくものは何もありません。

プログレスバー内でログを記録すると、すべてが台無しになります。誰かが正しい結果を得た場合、私は別の結果ベースの報奨金を差し上げます。

4

3 に答える 3