r语言 - 在另一个函数中运行 parLapply 和 future_map 不必要地将大型对象复制到每个工作线程



我一直在寻找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

相关内容

  • 没有找到相关文章

最新更新