我一直在寻找furrr:future_map()
的替代方案,因为当这个函数在另一个函数中运行时,它会将该函数内定义的所有对象复制到每个worker,而不管这些对象是否被显式传递(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 由 reprex 软件包 (v0.3.0(
如何防止big_obj
被复制到每个工作人员?我使用的是 Windows 机器,所以分叉不是一种选择。
您可以通过仅分配基本环境来更改本地函数的环境,使其不包含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