其他
对比R语言Raster包和Terra包栅格计算
Terra包可以认为是Raster的改进版,据说使用C语言重写了函数,提高了效率,同时支持并行计算,对于大数据量的栅格计算很有优势,我接下来就给大家展示一下我的试验。
这次实验数据是MODIS250m的NDVI数据,数据量比较大,有2272×4299个像元,20个波段。为了保证计算公平性,我都是从数据读取开始计时,统一计算变异系数cv,然后绘图,得到运行时间。
Raster计算CV
#Raster计算CV
t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
qb_NDVI <- brick(lapply(fl, raster))
qb_CV <- calc(qb_NDVI, cv)
plot(qb_CV)
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))
[1] "执行时间:264.080000000002秒"
Terra计算CV
未开启并行计算
我先使用非并行计算的方式计算变异系数,采用的数据和前面相同,在计算前先清空了前面计算读取数据缓存
t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
terra_qb <- rast(fl) #Terra包读取文件夹下所有TIFF,组成一个多波段数据
terra_cv <- app(terra_qb, cv)
plot(terra_cv)
#计时结束
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))
"执行时间:252.920000000013秒"
由此可见,经过优化的Terra包计算确实要比Raster快一些,缩短了十几秒的计算时间,那么我们再看看并行计算的情况呢?
Terra开启并行计算
这次开启了四核并行运算
t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
terra_qb <- rast(fl) #Terra包读取文件夹下所有TIFF,组成一个多波段数据
terra_cv <- app(terra_qb, cv, cores=4) #开了四核的并行计算
plot(terra_cv)
#计时结束
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))
"执行时间:92.1699999999983秒"
大大提速!接下来再试试8核齐开的情况呢?
"执行时间:64.3699999999953秒"
虽然8核比4核核心数增加了一倍,但是用时并没有减少为原来的一半,不过依然有着明显的提速效果。
结论:强烈安利Terra包,代替Raster执行栅格计算!
Raster和Terra函数对比
为了方便学习Rater和Terra包,下面引用一下Terra帮助中的Raster和Terra函数对比说明,Terra帮助文档中写的比较简略,但是结合这个对比来看,很多函数的特性就会更加明白。
参考文献
https://github.com/rspatial/terra https://rspatial.org/terra/modis/5-processing.html#ndvi R语言NDVI变异系数计算与结果分析 更多NDVI文章请查阅#NDVI专辑