Выполнение функции raster :: stackApply () параллельно - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь распараллелить этот пример.

У меня есть группа растров, которые я пытаюсь объединить по неделям года.Вот как это выглядит в серии:

# 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))

Это моя попытка распараллеливания с использованием snow и pbapply.

# 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>

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Попробуйте добавить progress='text' к аргументам stackApply.Он отлично работает в непараллельной версии.Удачи!

0 голосов
/ 18 сентября 2018

Я думаю, что нашел решение, используя метод raster::clusterR().Это не обеспечивает индикатор выполнения, хотя.Было бы здорово увидеть, если кто-то знает, как это сделать с snow и pbapply.

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())
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...