虽然使用foreach和doMC后端使用“多核”并行性(我在查看它时使用的是doMC,但其他软件包不允许从日志记录,我想获得进度栏,使用progress包,但是任何进度(在Linux终端上都可以运行,即没有tcltk弹出窗口)都可以。
考虑到它使用了分叉,我可以想象这不可能,但是我不确定。
当我并行(通常在#!Rscript中)加载串联的100个文件时,预期的用途是指示进度
我看了几则类似How do you create a progress bar when using the “foreach()” function in R?的帖子。很高兴为此奖励赏金。
EDIT
某人向我展示如何获得500点奖励
代表
# 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
赏金结束后,一切都没有达到预期的结果。
在进度栏中进行记录会弄乱一切。 如果有人得到正确的结果,我将给予另一个基于结果的赏金。
答案 0 :(得分:3)
这是使用自定义功能的解决方案(并非完美)。
此功能输出到控制台(使用message
)进度条。
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)
}
}
要测试的代码:
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)
}
PS:这不是完美的,因为:
100%
(取决于它可以在99%
处停止的迭代次数)print
中使用cat
/ foreach
,则不会刷新控制台答案 1 :(得分:1)
您可以参考此链接Progress bar parallel以获得一些有助于并行创建进度条的见解(可能不是确切的解决方案)。
txtProgressBar
仅在stype为2或3时有效
library("foreach")
library("doParallel")
library("progress")
registerDoParallel(parallel::makeCluster(7, outfile = ""))
pb <- progress_bar$new(
format = " [:bar] :percent in :elapsed",
total = 30, clear = FALSE, width = 80, force = T)
a <- foreach (i = 1:30) %dopar% {
pb$tick()
Sys.sleep(0.5)
}
pb <- txtProgressBar(title = "Iterative training", min = 0, max = 30, style = 3)
foreach (i = 1:30) %dopar% {
setTxtProgressBar(pb, i)
Sys.sleep(0.5)
}
请参考此链接Monitoring the function with progress bar,以了解根据需要实现进度条的不同方式。
使用多核: 您可以稍后注册其他并行后端,或通过调用registerDoSEQ函数注册顺序后端来注销doMC。例如考虑以下程序
> x <- iris[which(iris[,5] != "setosa"), c(1,5)]
> trials <- 10000
> ptime <- system.time({
+ r <- foreach(icount(trials), .combine=cbind) %dopar% {
+ ind <- sample(100, 100, replace=TRUE)
+ result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
+ coefficients(result1)
+ }
+ })[3]
> ptime
答案 2 :(得分:-1)
我用来并行处理列表的程序包是pbmcapply
,希望对您有所帮助。