Параллельная обработка растровых изображений в R

Я пытаюсь выполнить параллельный процесс для набора изображений, распределенных по нескольким каталогам, но продолжаю получать ошибки. мой dir_list длиной 140 строк, но выглядит примерно так:

dir_list <- c("/19/H/BB/2016/11/10/0/",
              "/19/H/BB/2016/4/4/0/",
              "/19/H/BB/2017/1/19/0/",
              "/19/H/BB/2017/3/20/0/",
              "/19/H/BB/2017/9/16/0/",
              "/19/H/BC/2016/11/10/1/",

Мой параллельный код выглядит так:

no_cores <- detectCores() - 1 # number of cores
cl <- makeCluster(no_cores) # make cluster
#export these to the cluster:
clusterExport( cl = cl, varlist = c('get_raster','divide_fun','gdal_translate',
                                    'spTransform','rootdir','readGDAL','raster',
                                    'aggregate','overlay','writeRaster','stack',
                                    'removeTmpFiles','rm')) # export required functions
clusterEvalQ(cl = cl, library(sp)) # include sp library
# run code. This seems to be very RAM heavy, it doesn't seem to dump objects from memory as much as it should.
parLapply(cl = cl, X = dir_list, fun = run_computation)
stopCluster(cl)

ОШИБКА: Тем не менее, мой процесс часто заканчивается рано, примерно после пятой папки - хотя до 5-й папки он производит вывод, который я хотел... он просто не может продолжать:

Error in checkForRemoteErrors(val) : 
  29 nodes produced errors; first error: 

Моя функция run_computation это несколько сложно, но выглядит примерно так:

run_computation <- function(dir_name){

  # final image to put out into each folder
  tif1 <- paste(rootdir, dir_name, 'image.tif', sep='') 

  # remove the old tiffs
  if(file.exists(tif1)) file.remove(tif1)

  # get each raster file from inside each directory. All directories have these
  r02 <- get_raster(dir_name,'r02')
  r02jp2 <- paste(rootdir, dir_name, 'r02.jp2', sep='')
  file.remove(r02jp2)
  r03 <- get_raster(dir_name,'r03')
  r03jp2 <- paste(rootdir, dir_name, 'r03.jp2', sep='')
  file.remove(r03jp2)

  # conditions
    t2 <- r02<10
    t3 <- r03<25

  # calculation
  process_calc <- overlay(r02, r03, fun=divide_fun)

  # find pixels that pass every condition
  pass <- t2 & t3

  # Filter and output final image
  output <- pass * process_calc
  writeRaster(x = output, filename = tif1, format='GTiff', overwrite=T)

  # # clean up
  removeTmpFiles(.01) # library raster seems to keep lots of temp files and filled up my hdd. This should fix.

}

Если я пытаюсь использовать меньше ядер, я получаю ту же ошибку:

Error in checkForRemoteErrors(val) : 
  10 nodes produced errors; first error: 

Если я уменьшу длину моего dir_list до 5-10 каталогов, кажется, работает более последовательно.

Есть что-то конкретное, что я могу делать неправильно, основываясь на вышесказанном?

0 ответов

Другие вопросы по тегам