gpt4 book ai didi

r - 在函数内部调用时 clusterApply 的性能下降

转载 作者:行者123 更新时间:2023-12-02 00:04:11 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题 clusterApply ,我已经能够尽我所能地将其隔离如下。首先,我从全局环境运行以下代码:

require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
x<-xl
clusterExport(cl,"x",environment())
f0<-function(z) eigen(x[[z]])
system.time(clusterApply(cl,1:20,f0))
## user system elapsed
## 0.332 0.264 3.334

现在,为了确保没有任何奇怪的事情发生,重新启动 R,然后运行这个类似的代码,它调用 clusterApply从函数内部:
require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
f<-function(clust,x){
force(x)
clusterExport(clust,"x",environment())
f0<-function(z) eigen(x[[z]])
print(system.time(clusterApply(clust,1:20,f0)))
}
f(cl,xl)
## user system elapsed
## 5.212 1.888 13.627

我做了一些搜索,找到了 this answer to a related question ,它指出函数中使用的局部变量在全局环境中未定义的被导出到集群中。所以我想,也许问题在于 x被导出两次,这需要很长时间,而不是实际的函数调用。为了测试这一点,我将函数定义更改为:
f0<-function(z) eigen(get("x")[[z]])

而且我的表现仍然很慢。有谁知道这里会发生什么?

顺便说一句,如果我只是打电话
clusterApply(clust,x,eigen)

在函数内部,那么它工作正常,就像在全局环境中一样快。当然,如果这是我想要解决的问题,我会简单地这样做,但事实并非如此,这只是一个玩具问题,用于隔离我在其他更复杂的代码中遇到的问题。

最佳答案

你的表现确实受到了伤害,因为变量 xf0 一起发送在每项任务中发挥作用。改变方式f0x没有区别:问题与如何f0无关用途 x或是否指x根本。它与何处有关 f0本身是定义的。如果您在 f 之外定义它使得 f0 的关联环境是全局环境,那么您的问题将得到解决。

如果要定义 f0f ,可以通过修改f0的环境来修复定义之后:

f<-function(clust,x){
force(x)
clusterExport(clust,"x",environment())
f0<-function(z) eigen(x[[z]])
environment(f0) <- .GlobalEnv
print(system.time(clusterApply(clust,1:20,f0)))
}

这解决了这个问题,因为全局环境永远不会与函数一起序列化。

原因 clusterApply(clust,x,eigen)效果很好的是 eigen未在 f 中定义, 所以 x eigen 时未捕获被连载。

关于r - 在函数内部调用时 clusterApply 的性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19467133/

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