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

使用并行编程(pdredge,R-package MuMIn)的R函数在另一个函数中非常慢,r,performance,parallel-processing,R,Performance,Parallel Processing,我成功地使用了软件包MuMIn中的函数pdredge(即使用并行计算的模型平均)。使用更多的内核可以按预期加快任务的速度。但是,当我在另一个函数中执行代码时,速度会大幅降低,即5-10倍。也就是说,“代码”可以正常工作,但“函数(代码)”不行。事实上,不使用并行化甚至更快。(我在“boot”[bootstrapping]中调用pdredge时遇到了同样的问题)问题是:如何在另一个函数中使用pdredge,从而获得预期的速度增益?有人有主意吗?我尝试了几件事,但都没用 我创建了一个可复制的小示例:

我成功地使用了软件包MuMIn中的函数pdredge(即使用并行计算的模型平均)。使用更多的内核可以按预期加快任务的速度。但是,当我在另一个函数中执行代码时,速度会大幅降低,即5-10倍。也就是说,“代码”可以正常工作,但“函数(代码)”不行。事实上,不使用并行化甚至更快。(我在“boot”[bootstrapping]中调用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
库(MuMIn)
图书馆(平行)
种子集(24121980)
#1)函数内的pdredge

科雷西没有经历这么大的变化。我第一次得了3.2分,第二次得了1.7分。谢谢。我认为差异的大小取决于计算机和可用内核的数量。在我的机器上,对于简单的示例代码,它会产生10倍的差异。无论差异有多长,这里重要的一点是,对于代码“1”来说,减速总是如此之大,以至于使用并行化与根本不使用并行化的计算时间更长,这不应该是这样的。。。。。