【发布时间】:2016-12-26 20:09:59
【问题描述】:
我想了解以下代码的结构。想知道它是否需要以不同的方式组织以更快地执行。具体来说,我是否需要在嵌套循环中以不同的方式使用 foreach 和 dopar。目前,内部循环是大部分工作(ddply 有 1-8 个细分变量,每个变量有 10-200 个级别),这就是我并行运行的。为简单起见,我省略了代码细节。
有什么想法吗?我的代码(如下所示)确实有效,但在 6 核、41gb 的机器上需要几个小时。数据集并没有那么大(
for(m in 1:length(Predictors)){ # has up to three elements in the vector
# construct the dataframe based on the specified predictor
# subset the original dataframe based on the breakdown variables, outcome, predictor and covariates
for(l in 1:nrow(pairwisematrixReduced)){ # this has 1-6 rows;subset based on correct comparison groups
# some code here
cl <- makeCluster(detectCores())
registerDoParallel(cl)
for (i in 1:nrow(subsetting_table)){ # this table has about 50 rows
# this uses the columns specified by k in the glm; the prior columns will be used as breakdown variables
# up to 10 covariates
result[[length(result) + 1]] <- foreach(k = 11:17, .packages=c('plyr','reshape2', 'fastmatch')) %dopar% {
ddply(
df,
b, # vector of breakdown variables
function(x) {
# run a GLM and manipulate the output
,.parallel = TRUE) # close ddply
} # close k loop -- set of covariates
} # close i loop -- subsetting table
} #close l -- group combinations
} # close m loop - this is the pairwise predictor matrix
stopCluster(cl)
result <- unlist(result, recursive = FALSE)
tmp2<-do.call(rbind.fill, result)
【问题讨论】:
-
我建议运行以下命令并阅读
%dopar%和%:%之间的区别。vignette("foreach")和vignette("nested") -
foreach 在 i 内
-
我错过了
foreach,但我建议阅读我上面提到的小插图。将foreach和ddply编写为foreach语句会更容易,其中一个使用%dopar,另一个使用%:%。小插图讨论了并行内循环与外循环的好处。您需要测试自己的代码,因为它依赖于数据,但它变得像在两个foreach之间交换%dopar%和%:%一样简单。 -
在创建
m*l时,将makeCluster和registerDoParallel移到for循环之外,您也可能会看到速度提升足够了。
标签: r foreach plyr doparallel