doParallel аварийно завершает работу на компьютере с Windows10 с ошибкой unserialize(socklist[[n]])

Я пытаюсь прочитать NetCDF, а затем выполнить растровую обработку и преобразовать их в определенный формат с помощью пакета R doParallel. Я привожу здесь только короткую воспроизводимую версию с использованием данных из растрового пакета. Этот фрагмент кода отлично работает на моем ПК.

library(raster)
library(sp)
library(doParallel)
library(foreach)

## specify the variables to download
vars = c('tmin', 'tmax', 'prec')
## specify the workdir
workdir <- getwd()

cl <- makeCluster(4)
registerDoParallel( cl)
start_time <- Sys.time()
##initiate the foreach loop
foreach(var = vars,.packages=c('raster','doParallel','foreach','base','naturalsort','ncdf4')) %dopar% {

  file <- getData("worldclim",var=var,res=10, lon=5, lat=45)

  ##initiate another foreach loop
  foreach(i = 1:12,.packages=c('raster','doParallel','foreach','base','naturalsort','ncdf4')) %dopar% {
    ##read the raster
    ras<-file[[i]]
    ## then I write the raster as tiff
    writeRaster(ras, paste(workdir,paste0(gsub(".nc","",var),"tempfile.tif"),sep=""), format="GTiff", overwrite=TRUE)
    ## create the output file name 
    outfile = paste(workdir,"\\",gsub(".nc","",var),"_",i,".map",sep="") 
    ## use gdal to translate the file format
    system(paste('gdal_translate -of PCRaster ',workdir,paste0(gsub(".nc","",var),"tempfile.tif")," ",outfile,sep=""))

  }
}
stopCluster(cl)
end_time <- Sys.time()
end_time - start_time

У меня AMD Ryzen Threadripper 2990WX 32-ядерный, 64-поточный процессор и 128 ГБ ОЗУ.

Однако, если я использую большое количество растров (10 000), как в моем практическом случае, то тот же фрагмент кода завершается с ошибкой

Error in unserialize(socklist[[n]]) : error reading from connection

Код R выполняется в течение нескольких временных шагов и создает несколько файлов. Внешний интерфейс R studio останавливается и выдает указанную выше ошибку. Но в фоновом режиме файлы действительно генерируются, но не для всех переменных. Например, я создал 4 кластера, 2 остановились через некоторое время, а другие 2 генерируют файлы, хотя внешний интерфейс RStudio выдает сообщение об ошибке. При этом иногда мой компьютер зависает и автоматически перезагружается.

Я также проверяю файл журнала, чтобы убедиться, что что-то не так, как упоминалось здесь и здесь. Я получаю следующее сообщение журнала, когда использую makeCluster(4,output ="log.txt")

starting worker pid=7276 on localhost:11852 at 12:34:27.693
starting worker pid=1396 on localhost:11852 at 12:34:27.846
starting worker pid=8060 on localhost:11852 at 12:34:27.990
starting worker pid=13648 on localhost:11852 at 12:34:28.140
Loading required package: sp
Loading required package: sp
Loading required package: sp
Loading required package: sp
Loading required package: foreach
Loading required package: foreach
Loading required package: iterators
Loading required package: iterators
Loading required package: foreach
Loading required package: foreach
Loading required package: parallel
Loading required package: parallel
Loading required package: iterators
Loading required package: iterators
Loading required package: parallel
Loading required package: parallel
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
In addition: Warning messages:
1: package 'raster' was built under R version 3.4.4 
2: package 'sp' was built under R version 3.4.4 
3: package 'naturalsort' was built under R version 3.4.4 
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
In addition: Warning messages:
1: package 'raster' was built under R version 3.4.4 
2: package 'sp' was built under R version 3.4.4 
3: package 'naturalsort' was built under R version 3.4.4 
Execution halted 

Если я использую тот же фрагмент кода с аналогичной версией R, пакетами и RStudio на другом компьютере с Windows (процессор Intel(R) Core(TM) i7-6700 @ 3,4 ГГц), код работает отлично.

Это как-то связано с процессорами AMD Ryzen?


person user3978632    schedule 09.08.2019    source источник
comment
Хотя я не могу ответить на ваш конкретный вопрос, я хотел бы отметить, что, если вы хотите, чтобы внутренний цикл foreach действительно использовал преимущества параллелизма, вам нужно вложить %:%, как описано в разделе < href="https://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf" rel="nofollow noreferrer">винье. В некоторых случаях лучше иметь только один уровень параллелизма, но в этом случае вы можете использовать %do% во внутреннем коде.   -  person Alexis    schedule 10.08.2019
comment
Спасибо, @Алексис. Хотя это не ответило на мой вопрос, я нашел виньетку весьма полезной.   -  person user3978632    schedule 12.08.2019
comment
Я получил эту ошибку, когда на моей машине закончилась память при выполнении параллельных приложений. У other windows machine больше оперативной памяти?   -  person CPak    schedule 12.08.2019
comment
@CPak У другой машины с Windows даже меньше оперативной памяти (64 ГБ), чем у этой (128 ГБ), где происходит сбой кода. Это не проблема оперативной памяти, так как у меня более чем достаточно оперативной памяти. Я проверил диспетчер задач и почти не использует 15% ОЗУ.   -  person user3978632    schedule 12.08.2019