Параллельная обработка растровых изображений в 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 каталогов, кажется, работает более последовательно.
Есть что-то конкретное, что я могу делать неправильно, основываясь на вышесказанном?