Ошибка в {: задача 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.

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