我正在尝试提高下面代码的执行速度,但我不确定是仅并行化最外层循环还是外部循环和内部循环。我正在使用2个处理器在Ubuntu上工作,我不知道每个处理器将创建多少线程来执行此任务,以及是否跨越多个线程会带来任何我应该注意并通过锁控制的复杂性。你会推荐什么?
ibrary(foreach)
library(doParallel)
nc = detectCores()
cl = makeCluster(nc, typr = “FORK”)
registerDoParallel(cl)
pts <- list(chunkSize=2)
foreach (H in 0:HexC, .combine = “c”) %:%{
foreach (HN in 0:HNcC, .Combine = “c”) %dopar%{
foreach (F in 0:FucC, .Combine = “c” ) %dopar%{
foreach (SA in 0:SAC, .Combine = “c”) %dopar%
foreach (SO3 in 0:SO3C,{
NAmax<- sum(SA+SO3)
foreach (NAD in 0:NAmax, .combine = “c”) %dopar%{
Na_Cnt<- c(Na_Cnt, NAD)
SO3_Cnt<- c(SO3_Cnt, SO3)
SA_Cnt<- c(SA_Cnt, SA)
Fuc_Cnt<- c(Fuc_Cnt, F)
HexNAc_Cnt<- c(HexNAc_Cnt, HN)
Hex_Cnt<- c(Hex_Cnt, H)
Na_Mass<- c(Na_Mass, NAD*NaAdductMass)
SO3_Mass<- c(SO3_Mass, SO3*dels["SO3"])
SA_Mass<- c(SA_Mass, SA*dels["SA"])
Fuc_Mass<- c(Fuc_Mass, F*dels["Fuc"])
HexNAc_Mass<- c(HexNAc_Mass, HN*dels["HexNAc"])
Hex_Mass<- c(Hex_Mass, H*dels["Hex"])
}
}
}
}
}
}
stopImplicitCluster()
stopCluster(cl)
答案 0 :(得分:2)
您的代码存在多个问题。 您可以根据上一次迭代中该变量的值来计算输出变量,例如:
Na_Mass<- c(Na_Mass, NAD*NaAdductMass)
相反,你需要做这样的事情:
Na_Mass <- foreach (NAD in 0:NAmax, .combine = “c”) %dopar%{
return(NAD*NaAdductMas)
}
有关更多示例,请参阅doParallel
包的文档:
https://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
对于程序将使用的CPU核心数,它将等于 HNcC * FucC * SAC * NAmax,可能是一个非常大的数字,并且您的计算机只有2个处理器,您将面临燃烧它的危险。同时,R中的每个并行进程都没有足够的CPU资源,并且运行速度会明显变慢。我会并行化不超过一个循环。
还有一点需要注意:这种计算Na_cnt和循环中其他对象的方法在有或没有并行化的情况下非常慢:
Na_Cnt<- c(Na_Cnt, NAD)
相反,你应该矢量化:
Na_Cnt <- 0:NAmax
类似地:
SO3_Cnt<- rep( SO3, NAMax+1)
SA_Cnt<- rep( SA, NAMax+1)
Fuc_Cnt <- rep(F, NAMax+1)
HexNAc_Cnt <- rep( HN, NAMax+1)
Hex_Cnt <- rep(H,NAMax+1 )
与最内层循环中的所有其他语句类似。这将显着加快,您不需要任何并行化。