foreach循环不起作用(并行化)

时间:2013-06-28 08:32:52

标签: performance r foreach parallel-processing

如果我想加快以下代码,我该怎么做?

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]]],]}

但我认为它与我原来的功能类似,我认为没有很大的改进。

你们有什么建议吗?

1 个答案:

答案 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,])