【发布时间】:2019-01-29 22:17:49
【问题描述】:
这可能是哲学家的问题...(或@Steve Weston 或@Martin Morgan)
我在使用 parLapply 时遇到了一些内存泄漏问题,在研究了足够多的线程之后,我认为这个问题是有根据的。我花了一些时间来尝试解决这个问题,虽然我对观察到的行为发生的原因有所了解,但我不知道如何解决它。
将以下内容视为源脚本,另存为:parallel_question.R
rf.parallel<-function(n=10){
library(parallel)
library(randomForest)
rf.form<- as.formula(paste("Final", paste(c('x','y','z'), collapse = "+"), sep = " ~ "))
rf.df<-data.frame(Final=runif(10000),y=runif(10000),x=runif(10000),z=runif(10000))
rf.df.list<-split(rf.df,rep(1:n,nrow(rf.df))[1:nrow(rf.df)])
cl<-makeCluster(n)
rf.list<-parLapply(cl,rf.df.list,function(x,rf.form,n){
randomForest::randomForest(rf.form,x,ntree=100,nodesize=10, norm.votes=FALSE)},rf.form,n)
stopCluster(cl)
return(rf.list)
}
我们使用以下方式获取和运行脚本:
scrip.loc<-"G:\\Scripts_Library\\R\\Stack_Answers\\parallel_question.R"
source(scrip.loc)
rf.parallel(n=10)
相当直接......我们并行运行了几个随机森林。似乎是内存效率。我们可以稍后将它们组合起来,或者做其他事情。便利。好的。举止得体。
现在考虑以下脚本,保存为parallel_question_2.R
rf.parallel_2<-function(n=10){
library(parallel)
library(magrittr)
library(randomForest)
rf.form<- as.formula(paste("Final", paste(c('x','y','z'), collapse = "+"), sep = " ~ "))
rf.df<-data.frame(Final=runif(10000),y=runif(10000),x=runif(10000),z=runif(10000))
large.list<-rep(rf.df,10000)
rf.df.list<-split(rf.df,rep(1:n,nrow(rf.df))[1:nrow(rf.df)])
cl<-makeCluster(n)
rf.list<-parLapply(cl,rf.df.list,function(x,rf.form,n){
randomForest::randomForest(rf.form,x,ntree=100,nodesize=10, norm.votes=FALSE)},rf.form,n)
stopCluster(cl)
return(rf.list)
}
在第二个脚本中,我们的源环境中有一个很大的列表。我们没有调用列表或将其带入我们的并行函数。我已将列表的大小设置为在至少 32gb 的机器上可能是个问题。
scrip.loc<-"G:\\Scripts_Library\\R\\Stack_Answers\\parallel_question_2.R"
source(scrip.loc)
rf.parallel_2(n=10)
当我们运行第二个脚本时,我们最终会携带大约 3gb(我们的大列表的大小)* 设置到集群的工作线程数,以及周围的其他材料。如果我们在非源环境中运行第二个脚本的内容,这不是行为;相反,我们得到一个约 3gb 的列表,并行化的函数运行没有问题,到此结束。
那么.. 工作环境如何/为什么从父环境中获取不必要的变量元素?为什么它只发生在源脚本中?当我有一个源代码、大型且复杂的脚本时,我该如何缓解这种情况,该脚本具有并行化的子部分(但可能携带 3-10gb 的中间数据)?
相关或类似主题:
【问题讨论】:
标签: r parallel-processing