Я пытаюсь прочитать 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?
foreach
действительно использовал преимущества параллелизма, вам нужно вложить%:%
, как описано в разделе < href="https://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf" rel="nofollow noreferrer">винье. В некоторых случаях лучше иметь только один уровень параллелизма, но в этом случае вы можете использовать%do%
во внутреннем коде. - person Alexis   schedule 10.08.2019other windows machine
больше оперативной памяти? - person CPak   schedule 12.08.2019