R-有没有办法创建嵌套的%dopar%foreach循环?

时间:2020-05-18 14:15:25

标签: r foreach parallel-processing multicore parallel-foreach

我正在使用64核工作站上的日常卫星图像系列。

对于每个图像,我使用foreach循环对所有像素执行一些代数运算。一些测试表明,此foreach循环的最佳内核数为20。

这大致就是我现在正在做的事情:

for (i in length(number_of_daily_images){

  # perform some pre-processing on each image

  # register cluster to loop over pixels
  registerDoParallel(20)

  out <- foreach(j=1:length(number_of_pixels_in_each_image)) %dopar% {

    # perform some calculations

  } # end inner loop
} # end outer loop

我只需要加载一次卫星图像,因此此代码中涉及的I / O处理很少。因此,肯定有进一步加快此代码速度的空间。由于我仅使用计算机上可用内核的三分之一,因此我想同时运行三天,以节省工作流程中的宝贵时间。

因此,我正在考虑同时并行化外循环。会是这样的:

# register cluster to loop over images
registerDoParallel(3)

out2 <- foreach (i = length(number_of_daily_images) %dopar% {

  # perform some pre-processing on each image

  # register cluster to loop over pixels
  registerDoParallel(20)

  out1 <- foreach(j = 1:length(number_of_pixels_in_each_image)) %dopar% {

    # perform some calculations

  } # end inner loop
} # end outer loop

但是,当我运行此代码时,出现一个错误,指出内部循环中处理所涉及的变量之一不存在。但这可以在“常规”外部for循环中正常工作。

因此,我的问题是:是否可以像我计划的那样在foreach中使用两个嵌套的%dopar%循环?如果没有,是否还有其他方法可以并行化我的外循环?

1 个答案:

答案 0 :(得分:1)

此处是Foreach维护者。

使用%:%运算符:

registerDoParallel(60)

out2 <- foreach(i = 1:length(number_of_daily_images)) %:% 
  foreach(j = 1:length(number_of_pixels_in_each_image)) %dopar% {

    # perform some calculations
    something(i, j)

  }