У меня очень длинная задача в R, которая выполняет много вычислений и записывает несколько файлов. Эта функция вызывается из Shiny-reactive. Поскольку это занимает так много времени, я хотел распараллелить его на нескольких процессах, но в то же время я хотел включить индикатор выполнения для конечного пользователя. Я внимательно следил за ответом на этот пост, в котором используется futures
: Использование стандартного блестящего индикатора выполнения R в параллельных вычислениях foreach.
Однако: файлы, которые создает моя функция, позже используются для дальнейшей обработки в другом реактиве. Почему-то я не могу позволить этому второму реактивному ожиданию, пока мое будущее полностью не завершится - он уже пытается читать файлы, которых либо еще нет, либо они неполные. Как мне сказать второму реактиву ждать, пока не завершится будущее?
Мой код на данный момент:
library(promises)
library(future)
library(ipc)
plan(multisession)
r1 <- eventReactive(input$go_Button, {
Runs <- 1:3 #3 parallel runs
prog <- list() #Setup for Progressbar
for (j in Runs) {
prog[[j]] <- AsyncProgress$new(message = "Calculation")
future_promise({
for (k in 1:length(rawdata_entries)) {
prog[[j]]$inc(1 / length(rawdata_entries))
<<< VERY LONG TASK THAT CREATES SEVERAL FILES >>>
}
prog[[j]]$close()
}) # end of future_promise
} # end of for loop
return(list("Done"=TRUE))
}) # end of eventReactive
r2 <- reactive({
if (r1()$Done == TRUE) { #my naive approach that doesn't work
<<<do some further processing with the files r1() created >>>
<<< creates the data-frame "some_results" >>>
return(some_result)
}
})
Самые важные вещи, которых я хочу достичь:
- распараллеливать трудоемкие вычисления
- есть индикатор выполнения для конечного пользователя
- полностью оценить обещание, прежде чем переходить к дальнейшим действиям
Где моя ошибка (и)?
Rcpp
. Время на вычисления сократилось с 30 минут до минуты. Вы, вероятно, добьетесь большего повышения производительности при использовании Rcpp, чем при распараллеливании. - person Eric Krantz   schedule 20.04.2021