使用并行编程(pdredge,R-package MuMIn)的R函数在另一个函数中非常慢

时间:2016-12-15 08:31:53

标签: r performance parallel-processing

我正在使用包MuMIn中的函数pdredge(即使用并行计算进行模型平均)。利用更多内核可以按预期加速任务。但是,当我从另一个函数中执行代码时,速度大幅减慢,即5-10倍。也就是说,"代码"工作正常,但"功能(代码)"才不是。事实上,不使用并行化甚至更快。 (我是从内&#34调用pdredge时遇到同样的问题;启动"引导])的问题是:如何才能pdredge被另一种功能,使得在速度上的收益正如人们所预料内使用?有没有人有想法?我尝试了几件事,但无济于事......

我创建了一个可重复的小例子:

library(MuMIn)
library(parallel)
set.seed(24121980)

# 1) pdredge within a function
cores<-4
clusterType <- if(length(find.package("snow", quiet = TRUE))) "SOCK" else "PSOCK"
clust <- try(makeCluster(getOption("cl.cores", cores), type = clusterType))

test<- function(myclust=clust){
p1 <- p2 <- p3 <- p4 <- p5 <- p6 <- rnorm(10000) # just for simplicity
mu    <- - 3*p1 - 0.6*p2 - 1.25*p4 +  1.85*p6 
y <- rnorm(10000, mu, 3)
dataex <- as.data.frame(cbind(y,p1,p2,p3,p4,p5,p6))
clusterExport(myclust, c("dataex"), envir=environment())
mymodel <- lm(y~.,data=dataex,na.action=na.fail)
mymo <- pdredge(mymodel, cluster=myclust)
}

ptm1 <-  proc.time()
test(myclust=clust)
ptm2 <-  proc.time()
mytime1 <- round((((ptm2-ptm1)/60))[1],digits=4)

stopCluster(clust)

# 2) pdredge not within a fucntion

cores<-4
clusterType <- if(length(find.package("snow", quiet = TRUE))) "SOCK" else "PSOCK"
clust <- try(makeCluster(getOption("cl.cores", cores), type = clusterType))
myclust<-clust

ptm3 <-  proc.time()
p1 <- p2 <- p3 <- p4 <- p5 <- p6 <- rnorm(10000)  # just for simplicity
mu    <- - 3*p1 - 0.6*p2 - 1.25*p4 +  1.85*p6 
y <- rnorm(10000, mu, 3)
dataex <- as.data.frame(cbind(y,p1,p2,p3,p4,p5,p6))
clusterExport(myclust, c("dataex"), envir=environment())
mymodel <- lm(y~.,data=dataex,na.action=na.fail)
mymo <- pdredge(mymodel, cluster=myclust)
ptm4 <-  proc.time()

mytime2 <- round((((ptm4-ptm3)/60))[1],digits=4)
stopCluster(clust)

# 1) parallel, 4 cores, in function
mytime1
# 0.0125 

# 2) parallel, 4 cores, no function
mytime2    
# 0.001

0 个答案:

没有答案