R-如何使用巨大的栅格堆栈加快计算



我有四个相当大的栅格堆栈,并想对它们进行一些简单的计算。如何加快这些计算?我使用Overlay()发现了这种方法,但是计算仍然需要很长时间。

我的rasterstacks(S1,S2,S3,S4)具有所有尺寸:26, 76, 1976, 3805 (nrow, ncol, ncell, nlayers),而我的当前代码如下:

out <- overlay(s1,s2,s3,s4, fun = function(rs1,rs2,rs3,rs4) {return((rs1+rs2-rs3-rs4)*1e3)})

有什么想法?

编辑:要产生栅格扇形(例如S1),您可以调用以下功能:

create_stack <- function(num.col,num.row,num.lay){
   r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row),
        xmn=0, xmx=num.col, ymn=0, ymx=num.row )
   ll <- replicate(num.lay , r )
   return(stack(ll))
}
library(raster)
s1 <- create_stack(76,26,3805)

增加chunksize在处理大型射手时很有帮助。我还建议将所有临时文件放入您可以轻松管理的目录中。

library(raster)
rasterOptions(tmpdir="C:\", tmptime = 24, progress="text", timer=TRUE,
              overwrite = T, chunksize=2e8, maxmemory=1e8)

在您的特定问题中

out <- (s1 + s2 - s3 - s4) * 1e3

似乎是应用您的功能的最快方法。

但是,对于其他问题,您应该查看clusterR()功能。它允许您并行应用功能。

" 只要您提供单个栅格堆栈或栅格式事号作为第一个参数。"

使用您的功能,我创建了此工作示例:

create_stack <- function(num.col,num.row,num.lay){
  r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row),
              xmn=0, xmx=num.col, ymn=0, ymx=num.row )
  ll <- replicate(num.lay , r )
  return(stack(ll))
}

library(raster)
s1 <- create_stack(76,26,3805)
s2 <- create_stack(76,26,3805)
s3 <- create_stack(76,26,3805)
s4 <- create_stack(76,26,3805)

beginCluster()
out <- clusterR(s1, fun = function(x,s2,s3,s4) {return((x + s2 - s3 - s4)*1e3)}, 
                args = list(s2 = s2, s3 = s3, s4 = s4), progress = "text")
endCluster()

作为一般的提示,我经历了该电话

beginCluster()

raster软件包开始时,通过许多栅格计算的段开始,可以带来未知的好处,因为许多raster功能已经实现用于并行计算。

最新更新