【问题标题】:Running raster::stackApply() function in parallel并行运行 raster::stackApply() 函数
【发布时间】:2018-09-18 19:54:05
【问题描述】:

我正在尝试并行化 this 示例。

我有一堆栅格,我试图按一年中的一周汇总。这是系列中的样子:

# create a raster stack from list of GeoTiffs
tifs <- list.files(path = "./inputData/", pattern = "\\.tif$", full.names = TRUE)
r <- stack(tifs)

# get the date from the names of the layers and extract the week
indices <- format(as.Date(names(r), format = "X%Y.%m.%d"), format = "%U")
indices <- as.numeric(indices)

# calculate weekly means
r_week <- stackApply(r, indices, function(x) mean(x, na.rm = TRUE))

这是我使用snowpbapply 进行并行化的尝试。

# aggregate rasters in parallel
no_cores <- parallel::detectCores() - 1 

tryCatch({
  cl <- snow::makeCluster(no_cores, "SOCK")
  snow::clusterEvalQ(cl, {
    require(pacman)
    p_load(dplyr
           ,rts
           ,raster
           ,stringr
           ,pbapply
           ,parallel)
  })
  parallel::clusterExport(cl = cl, varlist = list("r", "indices"))
  r_week <-  pbapply::pbsapply(r, indices, stackApply(r, indices, function(x) mean(x, na.rm = TRUE)), simplify = TRUE, USE.NAMES = TRUE, cl = cl)
  snow::stopCluster(cl)
}, error=function(e){
  snow::stopCluster(cl)
  return(e)
}, finally = {
  try(snow::stopCluster(cl), silent = T)
})

stackApply() 方法不采用集群参数,因此我尝试将其包装在 pbsapply() 中。这将返回以下错误:

<simpleError in get(as.character(FUN), mode = "function", envir = envir): object 'indices' of mode 'function' was not found>

【问题讨论】:

    标签: r parallel-processing raster r-raster snow


    【解决方案1】:

    我想我找到了使用raster::clusterR() 方法的解决方法。但它不提供进度条。很高兴看到有人知道如何使用snowpbapply 来做到这一点。

    tryCatch({
      system.time({
      no_cores <- parallel::detectCores() - 1
      raster::beginCluster(no_cores)
      myFun <- function(x, ...) {
        mean(!is.na(x))
      }
      r_week <- raster::clusterR(r, stackApply, args=list(indices = indices, fun = myFun, na.rm = TRUE))
      raster::endCluster()})
    }, error = function(e) {
      raster::endCluster()
      return(e)
    }, finally = {
      try(raster::endCluster())
    })
    

    【讨论】:

      【解决方案2】:

      尝试将progress='text' 添加到stackApply 参数。它在非并行版本中运行良好。祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-31
        • 2021-11-26
        • 2019-12-30
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多