嘿!
今天,我将完成有关如何提高使用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}提高栅格处理速度的教程。如果您有任何问题,请告诉我。再见!
马丁
4条留言
您可以在这篇文章中发表评论。
真的很棒的博客文章Martin–我在自己的栅格处理中一直在使用您的技巧。我很难过的是处理一堆栅格并执行大圆半径(5km)的focus()操作。这个操作只是突如其来–有没有一种方法可以快速处理foca()操作?我一直在使用您的2/3博客文章来实现for每个循环,它对于我的90m和1km半径的focus()操作非常有效…但是当重量为5km时,它会永远持续下去!有什么想法吗?再次感谢您的发帖,它们真的很有帮助
担 3年前
嘿,丹!
感谢您的反馈! ðŸ™,
您是否在焦点或默认加权总和内使用自定义函数?
默认值应该运行得很快,但是使用自定义功能时,需要确保对其进行尽可能高效的编程。
不幸的是,较大的窗口尺寸会增加处理时间。我没有’还没有找到解决方案。让我知道您是否发现了问题。
马丁干杯
马丁 3年前
[…],其像元数与输入栅格对象相同(来自?clusterR)。 马丁Åiklar在[[…]
簇R很甜–但要当心与预测fxn一起使用|蒂姆·阿萨尔 2年前
[…] […]
栅格并行化– Avian Ecologist 2年前
发表回复