我有四个相当大的栅格堆栈,并想对它们进行一些简单的计算。如何加快这些计算?我使用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
功能已经实现用于并行计算。