如果我想加快以下代码,我该怎么做?
pcg <- foreach(boot.iter=1:boot.rep) %dopar% {
d.boot<-d[in.sample[[boot.iter]],]
*此处in.sample [[boot.iter]]随机生成1000个行号。
我计划拆分整体任务,并将分开的试验发送到每个核心。例如,
sub_task<-foreach(i=1:cores.use)%dopar%{
for (j in 1:trialsPerCore){
d.boot<-d[in.sample[[structure[i,j]]],]}}
* structure是一个矩阵,包含从1到boot.rep
但是这个不行,似乎我们不能在foreach里面使用“for”循环?此外,d.boot仅保留每个核心的最后一次迭代。
我尝试在线搜索,我发现以下代码有效,
sub_task<foreach(i=1:cores.use)%:%
foreach(j=1:trialsPerCore)%dopar%{
d.boot<-d[in.sample[[structure[i,j]]],]}
但我认为它与我原来的功能类似,我认为没有很大的改进。
你们有什么建议吗?
答案 0 :(得分:0)
除非我遗漏了某些内容,否则如果foreach
循环中有任何计算,那么您的表现看起来并不多。您似乎只是从d
创建矩阵列表。除非您可以在循环中对这些矩阵执行操作,并且理想情况下从该操作返回相对较小的结果,否则这不会从并行计算中受益。
虽然“分块”通常有助于更有效地执行并行循环,但我认为它不会对此有所帮助。通信可能会更有效率,但你仍然只是进行了大量的沟通,基本上没有计算。
请注意,您尝试分块不起作用,因为for
循环中的foreach
循环会重复为同一个变量分配矩阵。然后,for
循环本身返回NULL
作为foreach
循环的主体,以便sub_task
是NULL的列表。在这种情况下,lapply
会更好。
有助于计算in.sample
循环中foreach
列表中的值。这将减少自动导出到每个工作人员的数据量,代价是对工作人员进行更多计算,这通常是您希望在并行循环中执行的操作。至少,你可以直接迭代in.sample
:
pcg <- foreach(i=in.sample) %dopar% d[i,]
在这种形式中,更加明显的是没有足够的计算来保证并行计算。如果没有任何实际计算要执行,最好使用lapply
:
pcg <- lapply(in.sample, function(i) d[i,])