У меня есть N задач, которые я хотел бы распараллелить по M ядрам в R. Эти задачи значительно различаются по тому, как долго они будут выполняться. К счастью, у меня есть приблизительное представление о том, какие задачи будут медленными, а какие - быстрыми. У меня также есть индикатор выполнения, который увеличивается на количество выполненных задач.
Я хочу оптимизировать порядок задач таким образом, чтобы:
- Общее время вычислений было сведено к минимуму
- Индикатор выполнения отображает оставшееся время, а не оставшиеся задачи.
Для более практического примера:
do_task <- function(x){
Sys.sleep(x ** 2)
}
tasks <- 1:10
cl <- parallel::makeCluster(4)
pbapply::pboptions(use_lb = TRUE)
pbapply::pblapply(tasks, do_task, cl = cl)
parallel::stopCluster(cl)
rm(cl)
Общее время обработки составляет 6 минут. и 32 секунды, и индикатор выполнения сначала движется быстро, но затем очень медленно, поскольку задачи занимают все больше и больше времени.
Или от самого длинного к самому короткому:
tasks <- 10:1
Это занимает 2 минуты и 20 секунд, намного быстрее. Но индикатор выполнения начинается очень медленно, а затем внезапно ускоряется.
Я также пытался чередовать задачи.
tasks <- c(10,1,9,2,8,3,7,4,6,5)
Это занимает 3 минуты и 20 секунд, не самые быстрые, но даетболее сбалансированный индикатор выполнения.