【问题标题】:How to speed up calculations using huge raster stacks?如何使用巨大的栅格堆栈加快计算速度?
【发布时间】:2017-02-28 13:42:36
【问题描述】:

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

【问题讨论】:

  • 请提供reproducible 示例。
  • 您可能想尝试使用 ff 包将您的 RasterStacks 转换为大的 3 维数组,然后对其进行计算。 ff 包在计算时效率更高,但是从rasterff 再到raster 的传输也可能需要一些时间。

标签: r r-raster


【解决方案1】:

在处理大型栅格时增加chunksize 有很大帮助。另外我建议将所有临时文件放在一个易于管理的目录中。

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

【讨论】:

  • 感谢您的评论和您给定的 rasterOptions 设置!根据您的评论,我在 .Rprofile 中更改了 rasterOptions,但到目前为止我还没有观察到巨大的性能提升......
  • 您也可以在保持chunksize 的同时尝试parallel processing。就我而言,仅增加 chunksize 就可以将处理时间减少一半。
【解决方案2】:

在您的具体问题中

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

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

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

“例如,它适用于 calc,它也适用于 overlay 只要您提供单个 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函数。

【讨论】:

  • 谢谢。我添加了一个函数来重现我的尺寸的光栅堆栈。不幸的是,我无法让您的代码运行。问题可能与this question?!
  • 谢谢,现在您的代码正在运行。如果您获得了性能提升,您是否停止了跑步时间?我仅用 100 层对其进行了测试,并为我最初的方法得到了这些措施:user: 81.791 system: 0.68 elapsed: 84.40。在您的代码中使用 4 个节点我得到了0.125 system: 0.018 elapsed: 95.32。根据this answeruser 时间应该是所有节点的总和,但是您的方法中更长的elapsed 时间从何而来?
  • 根据here 读写磁盘(raster tmpdir)可能是问题所在。
  • 我检查了system.time()。事实证明,光栅对象的简单加法和减法效果最好。查看答案的前两行
  • 非常感谢您的努力,我将您的回答标记为(非常)有用。我没有接受你的回答,因为我几天前就已经站了。这种方法可能是迄今为止我们发现的最快的方法,但它确实永远适用于我的系统。所以一定有更好的办法!
猜你喜欢
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多