Запуск parLapply и future_map внутри другой функции излишне копирует большие объекты каждому исполнителю
Я искал альтернативу furrr:future_map()
потому что, когда эта функция запускается внутри другой функции, она копирует все объекты, определенные внутри этой функции, каждому исполнителю независимо от того, переданы ли эти объекты явно ( https://github.com/DavisVaughan/furrr/issues/26).
Это выглядит как parLapply()
делает то же самое при использовании clusterExport()
:
fun <- function(x) {
big_obj <- 1
cl <- parallel::makeCluster(2)
parallel::clusterExport(cl, c("x"), envir = environment())
parallel::parLapply(cl, c(1), function(x) {
x + 1
env <- environment()
parent_env <- parent.env(env)
return(list(this_env = env, parent_env = parent_env))
})
}
res <- fun(1)
names(res[[1]]$parent_env)
#> [1] "cl" "big_obj" "x"
Создано 06.01.2020 пакетом REPEX (v0.3.0)
Как я могу сохранить big_obj
от копирования каждому работнику? Я использую машину с Windows, поэтому разветвление не вариант.
1 ответ
Решение
Вы можете изменить среду своей локальной функции, чтобы она не включала big_obj
путем присвоения, например, только базовой среды.
fun <- function(x) {
big_obj <- 1
cl <- parallel::makeCluster(2)
on.exit(parallel::stopCluster(cl), add = TRUE)
parallel::clusterExport(cl, c("x"), envir = environment())
local_fun <- function(x) {
x + 1
env <- environment()
parent_env <- parent.env(env)
return(list(this_env = env, parent_env = parent_env))
}
environment(local_fun) <- baseenv()
parallel::parLapply(cl, c(1), local_fun)
}
res <- fun(1)
"big_obj" %in% names(res[[1]]$parent_env) # FALSE