Ошибка в {: задача 1 не выполнена - "ошибка, возвращенная из вызова C" с использованием ncvar_get (пакет ncdf4) в цикле foreach
Я пытаюсь извлечь данные из файла.nc. Поскольку в моем файле 7 переменных, я хочу перебрать функцию ncvar_get по всем 7, используя foreach.
Вот мой код:
# EXTRACTING CLIMATE DATA FROM NETCDF4 FILE
library(dplyr)
library(data.table)
library(lubridate)
library(ncdf4)
library(parallel)
library(foreach)
library(doParallel)
# SET WORKING DIRECTORY
setwd('/storage/hpc/data/htnb4d/RIPS/UW_climate_data/')
# SETTING UP
cores <- detectCores()
cl <- makeCluster(cores)
registerDoParallel(cl)
# READING INPUT FILE
infile <- nc_open("force_SERC_8th.1979_2016.nc")
vars <- attributes(infile$var)$names
climvars <- vars[1:7]
# EXTRACTING INFORMATION OF STUDY DOMAIN:
tab <- read.csv('SDGridArea.csv', header = T)
point <- sort(unique(tab$PointID)) #6013 points in the study area
# EXTRACTING DATA (P, TMAX, TMIN, LW, SW AND RH):
clusterEvalQ(cl, {
library(ncdf4)
})
clusterExport(cl, c('infile','climvars','point'))
foreach(i = climvars) %dopar% {
climvar <- ncvar_get(infile, varid = i) # all data points 13650 points
dim <- dim(climvar)
climMX <- aperm(climvar,c(3,2,1))
dim(climMX) <- c(dim[3],dim[1]*dim[2])
climdt <- data.frame(climMX[,point]) #getting 6013 points in the study area
write.table(climdt,paste0('SD',i,'daily.csv'), sep = ',', row.names = F)
}
stopCluster(cl)
И ошибка:
Error in { : task 1 failed - "error returned from C call"
Calls: %dopar% -> <Anonymous>
Execution halted
Не могли бы вы объяснить, что не так с этим кодом? Я предполагаю, что это как-то связано с тем, что кластер не может определить, какую переменную получить из файла, поскольку "ошибка, возвращаемая из вызова C", обычно исходит из аргумента ncvar_get varid.
0 ответов
У меня была та же проблема (идентичное сообщение об ошибке) при запуске аналогичного R-скрипта на моем MacBook Pro (OSX 10.12.5). Кажется, проблема в том, что разные рабочие из цикла foreach пытаются получить доступ к одному и тому же файлу.nc одновременно с помощью ncvar_get. Эту проблему можно решить, используя ncvar_get вне цикла foreach (сохраняя все данные в большом массиве) и получая доступ к этому массиву из цикла foreach.
У меня была такая же проблема на недавно приобретенной рабочей машине. Однако тот же код отлично работает на моем домашнем сервере.
Разница в том, что на моем сервере я создаю netCDF
библиотеки с включенным параллельным доступом (что требует HDF5
скомпилирован каким-нибудь компилятором MPI).
Я подозреваю, что эта функция может предотвратить ошибку OP.