基准测试:R vs. 蟒蛇 光栅 vs. GDAL

嘿!
今天,我想对三种栅格处理工具进行一下比较:
R,Python(rasterio)和GDAL。
当我开始使用GIS和栅格处理时,我没有’确实要非常注意我编写的脚本和所用工具的性能。但是现在,使用更大的一定牛遗漏,更高的空间分辨率,快速处理栅格文件是成功的关键。因此,我将为您比较三种栅格处理工具的性能,即使用Landsat 8子集进行的简单NDVI计算:

一定牛遗漏:

首先,让我们看一下一定牛遗漏’ve用于基准测试:它’从以下位置下载的标准Landsat 8图像 USGS EarthExplorer页面.
它的空间分辨率为30mx30m,子集的大小为3485×4606像素场景描绘了俄罗斯西伯利亚的贝加尔湖:
陆地卫星 8子集显示俄罗斯西伯利亚的贝加尔湖

经过测试的处理工具:

我在此基准测试中测试的处理工具如下:R,Python 栅格io和GDAL。

R

R是用于统计计算和图形的免费软件环境。它可以在各种UNIX平台,Windows和MacOS上编译并运行。在这里,我专注于 {raster} 广泛用于R中光栅文件处理的软件包。在这里阅读更多]

我测试了两种算法:

  • 第一次使用 覆盖() 光栅包中的功能。此功能使用户可以使用两个或多个输入波段执行栅格代数。这对于NDVI的计算是必需的。
  • 第二个,使用标准R语法。

您可以在下面查看这两个代码段:

library(raster)

#----------1. ALGORITHM - RASTER PACKAGE with OVERLAY FUNCTION -------------
ras <- stack("baikal_subset.tif")

ndvi <- overlay(ras, fun=function(x){(x[1]-x[2])/(x[1]+x[2])})

writeRaster(ndvi, "ndvi_subset_raster.tif", 
            一定牛遗漏type="FLT8S",
            options=c("compress=lzw"),
            overwrite=T)

#---------- 2. ALGORITHM - RASTER with STANDARD R SYNTAX -----------------
ras <- stack("baikal_subset.tif")

b1 <- ras[[1]]
b2 <- ras[[2]]

ndvi = (b1-b2)/(b1+b2)

writeRaster(ndvi, "ndvi_subset_R.tif", 
            一定牛遗漏type="FLT8S",
            options=c("compress=lzw"),
            overwrite=T)

 

蟒蛇 光栅

光栅在后台使用GDAL进行文件I / O和栅格格式化。它的函数通常接受并返回Numpy ndarrays。 光栅旨在使处理地理空间栅格一定牛遗漏更加高效和有趣。 [在这里阅读更多]

您可以看下面的代码:

import 栅格io
import numpy

with 栅格io.drivers():
    with 栅格io.open('baikal_subset.tif') as src:
        b1, b2, b3, b4, b5 = src.read()

        profile = src.profile
        profile.update(
            dtype=rasterio.float64,
            count=1,
            compress='lzw')

    ndvi = numpy.zeros(b1.shape)
    ndvi = (b1-b2)/(b1+b2)

    with 栅格io.open('ndvi_python.tif', 'w', **profile) as dst:
        dst.write(ndvi.astype(rasterio.float64), 1)

GDAL

我使用的最后一个工具是 GDAL 和功能 盖达尔_calc.py:

GDAL是一个栅格和矢量地理空间一定牛遗漏格式的转换器库,在 X /麻省理工学院 风格 开源的 执照 开源地理空间基金会。作为图书馆,它提出了一个 单一栅格抽象一定牛遗漏模型矢量抽象一定牛遗漏模型 调用应用程序以获取所有受支持的格式。它还带有用于一定牛遗漏转换和处理的各种有用的命令行实用程序。的 新闻 网页介绍了2016年1月发布的GDAL / OGR 2.0.2。 [在这里阅读更多]

基准结果

对于基准测试,我分别运行了上述所有脚本5次,并得到以下非常有趣的结果:

最快的处理是由GDAL完成的,平均值为5.8秒。 python 栅格io软件包的速度稍慢,平均处理时间为7.95秒。不幸的是,我最喜欢的软件R是最慢的:使用标准R语法记录的平均处理时间为15.3秒,这让我震惊(!):光栅包中的overlay()函数平均需要105.84秒才能计算出来自Landsat 8子集的NDVI。

注意: 该基准测试是在配备有1.8 GHz Intel Core i5和8GB 1600 MHz DDR3,OS X El Capitan的MacBook Air上进行的。这是我的版本号:R 3.2.3,Python 2.7,GDAL 1.11.3和Rasterio 0.31.0。

如果您有任何问题,请告诉我。

干杯

马丁

关于作者

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

3条留言

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


  • 感谢Martin的速度测试。我在R中使用栅格一定牛遗漏包所获得的经验证实,从某种程度上来说,它非常慢并且经常不稳定。
    现在,为什么GDAL是赢家?恕我直言,因为它是用C编写的。您同意吗?

    西蒙 在4年前 回复


    • 亲爱的西蒙,
      我很高兴收到你的来信。是的,正如您已经指出的那样’的原因是GDAL是用C / 蟒蛇编写的,因此速度更快。最近,我偶然发现了与R并行化的可能性,这极大地提高了许多处理任务的性能。您绝对应该查看我关于该主题的帖子。
      希望你一切都好。
      干杯马丁

      马丁 在4年前 回复


  • 有趣的帖子。我同时使用R和Python(通过Rasterio)进行空间一定牛遗漏分析和栅格一定牛遗漏处理。的确,Python在许多方面确实感觉更快。但是,有关基准测试的评论是,您的Rasterio脚本会将整个图像堆栈加载到numpy数组中进行处理,这当然非常快。但是,对于许多涉及高分辨率图像和/或大网格的分析,无法将整个一定牛遗漏集加载到numpy中。我很少使用这种方法。 R通过栅格一定牛遗漏包(适用于您的两个示例)正在从磁盘上的栅格读取一定牛遗漏块,并且还使用临时文件存储处理结果。因此它会慢很多,但是这种方法更加复杂,因为可以处理任何尺寸的网格。等效的Python代码在编码方面需要进行大量工作,并涉及使用窗口读取在栅格中循环,以numpy执行计算,然后窗口写入结果。这将慢得多,并且比较有趣的是使用Rasterio中的窗口式读写来比较基准,其中涉及Python中的循环,而R中我相信Raster包的此组件是用C ++编写的。

    史蒂夫 在4年前 回复


发表回复

*