r - 是否有可能获得带有 foreach 和“多核类型”后端的进度条
问题描述
在使用foreach和doMC后端使用“多核”并行性时(我在查看它时使用 doMC,其他包不允许从我想使用进度包获取进度条进行日志记录,但是任何进度(这适用于 linux 终端,即没有 tcltk 弹出窗口)可以做到。
鉴于它使用分叉,我可以想象这可能是不可能的,但我不确定。
预期用途是在我并行加载连接的 100 个文件时指示进度(通常在 #!Rscript 内)
我看过一些帖子,比如在 R 中使用“foreach()”函数时如何创建进度条?. 很高兴为此提供赏金。
编辑
为向我展示如何操作的人提供 500 点赏金
- 使用 foreach 和多核(分叉)类型的并行
- 获取进度条
- 使用 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
赏金结束后,没有什么能接近预期的结果。
在进度条中记录会使一切变得混乱。如果有人得到正确的结果,我将给予另一个基于结果的赏金。
解决方案
这是使用自定义功能的解决方案(不完美)。
此函数输出到控制台(使用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)
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)
}
PS:它并不完美,因为:
- Bar 并不总是运行到
100%
(取决于它可以停止的迭代次数99%
) - 有时输出会混乱(取决于迭代次数和切换频率) - 仍在调试这部分
- 如果您在其中使用
print
/ ,则不会刷新控制台cat
foreach
推荐阅读
- sed - 用 sed 替换第 n 个匹配行
- python - 如何让 Nose2 测试在 Visual Studio Code 上运行?
- azure - Azure 功能 Key Vault
- python - 自底向上构建二叉树
- python - Django - 如何创建一个有效的 slug url?
- python - Python 2.7 csv 模块仅 498 项
- react-native - 在 React Native 中使用状态和道具
- ruby-on-rails - Pundit::NotAuthorizedError - ApplicationPolicy 继承不起作用
- python - 从python中的文本拆分
- reactjs - 连接 Redux devtools 和 Thunk 中间件到 store