使用R提高{raster}处理的速度:第3/3部分集群

嘿!

今天,我将完成有关如何提高使用R处理栅格图像的速度的系列文章。在最后两篇文章中,我谈到了 更改rasterOptions() 和关于 使用foreach()并行化。 这两个选项的migth都能为您带来不错的速度提升并减少您的处理时间。在本文中,我将借助{raster}包中的clusterR函数讨论集群中的处理。

簇R 是用于将集群与其他功能一起使用的灵活界面。该函数仅适用于将Raster *对象作为第一个参数并且以像元为单位进行操作的函数(即,没有对像元进行近邻处理)并返回与输入栅格对象具有相同像元数的对象的函数。 (来自?clusterR)

因此,此功能的作用是将通常在单个内核上运行的进程外包给 n 用户指定的其他核心。 Thies大大提高了速度,并最大程度地缩短了处理时间。群集通过以下(光栅)功能可以很好地工作: calc(),overlay() 要么 预测()。但是,它不适用于 merge(),crop(),mosaic(),(dis)aggregate(),resample(),projectRaster(),focus(),distance(),buffer()direction()。

没有clusterR的示例

让’s say 拉斯 是我们的栅格堆栈,我们想计算堆栈中每个像素的均值。这就是你会怎么做的 calc() 用一个 单核:

拉斯.mean <- calc(ras, mean, na.rm=T)

使用clusterR的示例

现在想象一下,它是一个具有许多层的大栅格。此操作可能需要先完成。在这里 簇R() 功能派上用场:

beginCluster(4)

ras.mean <- 簇R(ras, calc, args=list(mean, na.rm=T))

endCluster()

命令 beginCluster(4) 在您的PC上初始化群集,并为该进程分配4个内核。 (请注意,您受到PC内核数量的限制。如果使用的内核过多,则PC可能会崩溃。)

然后魔术发生了: 簇R() 调用函数 calc() 称为功能 意思()。请注意,由调用的函数 calc() 必须用 list().

该过程完成后,使用以下命令关闭集群 endCluster().

通过用户定义的函数使用clusterR和calc

您也可以将 簇R()calc() 与您的自定义功能一起使用:

a <- 10
f3 <- 功能(x) sum(x)+a
beginCluster(4)
z1 <- 簇R(s, calc, args=list(fun=f3), 出口='a')
endCluster()

什么时候 f3() 是您的自定义函数,只需将其插入列表内的args参数即可。如果您在函数中使用参数,例如 一种, 你需要使用 出口=’parameter name’ 使该参数可用于所有其他内核。

您可以在 簇R() 功能 这里.

我希望您喜欢上一篇有关使用R {raster}提高栅格处理速度的教程。如果您有任何问题,请告诉我。再见!

马丁

关于作者

马丁出生于捷克共和国,就读于维也纳自然资源与生命科学大学。他目前在GeoVille(一家位于奥地利的地球观测公司)工作,专门从事土地监测。他的主要兴趣是:开源应用程序,例如R,(地理空间)统计和数据管理,Web映射和可视化。他喜欢旅行,寻宝,摄影和运动。

4条留言

您可以在这篇文章中发表评论。


  • 真的很棒的博客文章Martin–我在自己的栅格处理中一直在使用您的技巧。我很难过的是处理一堆栅格并执行大圆半径(5km)的focus()操作。这个操作只是突如其来–有没有一种方法可以快速处理foca()操作?我一直在使用您的2/3博客文章来实现for每个循环,它对于我的90m和1km半径的focus()操作非常有效…但是当重量为5km时,它会永远持续下去!有什么想法吗?再次感谢您的发帖,它们真的很有帮助

    3年前 回复


    • 嘿,丹!
      感谢您的反馈! ðŸ™,
      您是否在焦点或默认加权总和内使用自定义函数?
      默认值应该运行得很快,但是使用自定义功能时,需要确保对其进行尽可能高效的编程。
      不幸的是,较大的窗口尺寸会增加处理时间。我没有’还没有找到解决方案。让我知道您是否发现了问题。

      马丁干杯

      马丁 3年前 回复


  • […],其像元数与输入栅格对象相同(来自?clusterR)。 马丁Åiklar在[[…]

    簇R很甜–但要当心与预测fxn一起使用|蒂姆·阿萨尔 2年前 回复



发表回复

*