Запуск parLapply и future_map внутри другой функции без необходимости копирует большие объекты каждому работнику - PullRequest
0 голосов
/ 06 января 2020

Я искал альтернативу 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"

Создано в 2020-01-06 представ пакет (v0.3.0)

Как я могу предотвратить копирование big_obj каждому работнику? Я использую Windows машину, поэтому разветвление не вариант.

1 Ответ

1 голос
/ 07 января 2020

Вы можете изменить среду вашей локальной функции, чтобы она не включала 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
...