Есть ли способ настроить furrr::future_map
, который бы позволял использовать вложенный вариант использования? Рассмотрим следующий код:
library(furrr)
library(tictoc)
# The problem is easier to reason about if you take N
# smaller than your number of cores, and M big.
N = 2
M = 100
plan(sequential)
tic()
x = future_map(1:N, function(i){
furrr::future_map(1:M,function(j){
Sys.sleep(1/M)
return(1)
})
})
toc() # 2sec + overhead
plan(multiprocess)
tic()
x = future_map(1:N, function(i){
furrr::future_map(1:M,function(j){
Sys.sleep(1/M)
return(1)
})
})
toc() # one sec + overhead !!
Первый должен занять чуть больше 2se c. Хорошо. Но есть ли способ заставить второй взять меньше, чем 1se c, даже на машине с тысячей ядер?
Мой вариант использования следующий: некоторые подзадачи выполняются дольше, чем другие, а когда некоторые заканчиваются, некоторые ядра могут свободно перемещать более длинные задачи.
Но по умолчанию furrr не делает этого, и выполняющиеся задачи заканчиваются только на одном ядре. Проблема эквивалентна той, что показана в приведенном выше коде: есть ли способ выполнить повторную отправку внутренних заданий furrr, если некоторые ядра свободны?
Это просто невозможно делать, или я пропустил параметр для вызовов furrr / future?