gpt4 book ai didi

r - 函数内部的 parLapply 意外地将数据复制到节点

转载 作者:行者123 更新时间:2023-12-04 02:13:46 26 4
gpt4 key购买 nike

我有一个很大的列表(~30GB)并且功能如下:

cl <- makeCluster(24, outfile = "")

Foo1 <- function(cl, largeList) {
return(parLapply(cl, largeList, Bar))
}

Bar1 <- function(listElement) {
return(nrow(listElement))
}

Foo2 <- function(cl, largeList, arg) {
clusterExport(cl, list("arg"), envir = environment())
return(parLapply(cl, largeList, function(x) Bar(x, arg)))
}

Bar2 <- function(listElement, arg) {
return(nrow(listElement))
}

没有问题:

Foo1(cl, largeList)

观察每个进程的内存使用情况,我可以看到只有一个列表元素被复制到每个节点。

但是,调用时:

Foo2(cl, largeList, 0)

正在将 largeList 的副本复制到每个节点。通过 Foo2,largeList 复制不是发生在 clusterExport 上,而是发生在 parLapply 上。此外,当我从全局环境(不在函数内)执行 Foo2 的主体时,没有任何问题。这是什么原因造成的?

> sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Fedora 21 (Twenty One)

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] parallel splines stats graphics grDevices utils
[7] datasets methods base

other attached packages:
[1] xts_0.9-7 zoo_1.7-12 snow_0.3-13
[4] Rcpp_0.12.2 randomForest_4.6-12 gbm_2.1.1
[7] lattice_0.20-33 survival_2.38-3 e1071_1.6-7

loaded via a namespace (and not attached):
[1] class_7.3-13 tools_3.2.2 grid_3.2.2

最佳答案

问题在于作为 parLapply 的第三个参数的 worker 函数被序列化并与输入数据一起发送给每个 worker。如果 worker 函数是在函数内部定义的,例如 Foo2,则本地环境会与其一起序列化。由于 largeListFoo2 的参数,它在本地环境中,因此与辅助函数一起序列化。

Foo1 没有问题,因为 Bar 大概是在全局环境中创建的,并且全局环境永远不会与函数一起序列化。

换句话说,在使用 parLapplyclusterApplyclusterApplyLB< 时,始终在全局环境或包中定义 worker 函数是个好主意 等。当然,如果您从全局环境调用 parLapply,则匿名函数是在全局环境中定义的。

关于r - 函数内部的 parLapply 意外地将数据复制到节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35851761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com