具有嵌套循环的 R 并行处理



我正在尝试提高以下代码的执行速度,但我不确定是仅并行化最外层循环还是外部循环和内部循环。我正在使用 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)

您的代码存在多个问题。 您的代码根据上一次迭代中该变量的值计算输出变量,例如:

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 )

与最内层循环中的所有其他语句类似。这将大大加快速度,并且您不需要任何并行化。

最新更新