2017-02-28 38 views
1

我有四个相当巨大的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

请提供[reproducible](http://stackoverflow.com/q/5963269/3250126)示例。 – loki

+0

您可能想尝试使用'ff'软件包将RasterStacks转换为大3维的数组,然后对其进行计算。 ff软件包在计算上效率更高,但是从'raster'到'ff'转回''raster'也可能需要一些时间。 – Bastien

回答

1

在您的具体问题

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

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

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

“举个例子,它的工作原理与,它也与覆盖 只要你提供一个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函数已经用于并行计算。

+0

谢谢。我添加了一个函数来重现我的维度的rasterstacks。不幸的是,我无法让你的代码运行。这个问题可能与[这个问题]有关(http://stackoverflow.com/questions/35369137/clusterr-with-multiple-raster-stacks)?! – moremo

+0

谢谢,现在你的代码正在运行。如果你获得了性能提升,你是否停止了跑步时间?我测试了它只有100层,并得到了我原来的方法这些措施:'用户:81.791系统:0.68过去了:84.40'。在代码中使用4个节点我得到了'0.125系统:0.018过去了:95.32'。根据[这个答案](http:// stackoverflow。com/questions/18654497/mclapply-user-time-large-elapsed-time)'用户'时间应该是所有节点的总和,但是在哪里呢,你的方法所花的时间越长呢? – moremo

+0

根据[这里](http://stackoverflow.com/questions/13688840/what-c​​aused-my-elapsed-time-much-longer-than-user-time)读取和写入磁盘(光栅tmpdir)可能是问题。 – moremo

2

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

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

感谢您的评论和您给出的rasterOptions设置!根据你的评论,我在我的.R档案中改变了我的rasterOptions,但到目前为止,我还没有观察到巨大的性能增益...... – moremo

+0

你也可以尝试'parallel processing',同时保持'chunksize'。就我而言,仅仅增加'chunksize'就能将处理时间缩短一半。 –