如何使用巨大的栅格堆栈加速计算?

时间:2017-02-28 13:42:36

标签: r r-raster

我有四个非常庞大的RasterStack,并希望对它们进行一些简单的计算。如何加快这些计算?我找到this approach using 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)})

有什么想法吗?

编辑:要生成RasterStack(例如,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)

2 个答案:

答案 0 :(得分:2)

在处理大型栅格时,增加chuncksize会有很大帮助。另外,我建议将所有临时文件放在一个可以轻松管理的目录中。

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

答案 1 :(得分:1)

在您的具体问题中

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

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

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

  

“例如,它适用于 calc ,它也适用于叠加   只要你提供一个RasterStack或RasterBrick作为第一个参数。“

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

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函数。