Hey there 栅格R folks!
我喜欢用R编码–我大部分时间都在花时间使用{raster}软件包处理栅格数据,因为’与其他脚本语言相比,它非常直观且易于使用。但是有时候,当我处理较大的数据集或必须处理大量文件时,漫长而漫长的处理时间使我想知道R是否始终是最佳选择…当然是这样!您只需要知道如何通过以下两种方法来提高R的性能 编写更有效的代码 要么 簇 和 并行化 您的R函数。由于这对于许多R初学者和一些高级编码人员来说似乎是一个很大的摇篮,所以我决定编写一个有关此主题的教程:它由三部分组成,其中我将描述如何加快光栅包的处理时间。 。
今天,我们将对该主题进行简短介绍,并且我将向您展示如何通过在R会话中设置一些本地rasterOptions()来加快处理时间,这将为您带来良好的初始速度提升。
栅格Options()
{raster}包中的rasterOptions()函数使您可以自定义R会话。如果您输入 栅格Options() 没有参数,您可以看到当前(默认)设置:
> 栅格Options() format : 栅格 datatype : FLT8S overwrite : FALSE progress : none timer : FALSE chunksize : 1e+07 maxmemory : 1e+08 tmpdir : /var/folders/lk/hg070f5n4md9hrchf__th6080000gn/T//RtmpQrCgZD/raster// tmptime : 168 setfileext : TRUE tolerance : 0.1 standardnames : TRUE warn depracat.: TRUE header : none
有两个参数对{raster}软件包的性能有很大影响: 块大小 和 最大内存.
- 块大小: 整数。在处理(逐块)基于磁盘的Raster *对象时,单个块中可读取/写入的最大单元数
- 最大内存: 整数。要读入内存的最大单元数。
最大内存的默认值为1e + 08。让我们看看增加最大内存限制时,简单栅格计算的处理时间是否以及如何变化。要增加限制,您可以简单地编写:
栅格Options(maxmemory = 1e+09)
基准测试
为了测试对最大内存设置的处理时间的影响,我将Landsat 8子集加载到R中并进行了简单的计算:十次,最大内存限制为1e + 08,十次,限制为1e + 09:
Here is an summary on the 栅格 image that was used for the benchmark:
class : RasterStack dimensions : 3485, 4606, 16051910, 5 (nrow, ncol, ncell, nlayers) resolution : 30, 30 (x, y)
And here the code for the simple (nonsene) 栅格 calulation to evaluate the time:
start <- Sys.time() ras_calc <- ras ^ 2 + ras end <- Sys.time() difftime(end,start)
结果:
从1e + 08到1e + 09的最大内存限制增加所节省的时间非常可观。执行简单计算任务平均需要61秒的下限内存(1e + 08)。较高的限制(1e + 09)的性能要好得多,只需要大约35秒即可执行相同的任务。您可以在下面的方框图中看到最终结果:
我希望这对某些人有用。本教程的第二部分 “使用R提高{raster}处理的速度” 将介绍如何使用{foreach}和{doParallel}包并行化R代码。
再见!
马丁
4条留言
您可以在这篇文章中发表评论。
谢谢!这使得我的脚本不会在群集上崩溃
F A 在4年前
很开心听到!干杯马丁
马丁 在4年前
马丁先生,您好,首先感谢您分享有用的提示‘raster’R包加工。
I’d想知道最大内存是否有限制。例如,我们可以根据计算机内存估计最大内存限制吗?你怎么看?
提前致谢
何塞·卢卡斯(Jose Lucas) 在4年前
是的,有一个限制。您可以在此处找到详细的答案: http://stackoverflow.com/questions/38368939/rasteroptions-difference-between-chunksize-and-maxmemory
马丁 在4年前
发表回复