我有四个非常庞大的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)
答案 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
函数。