{ 中的错误:任务 1 失败 - "error returned from C call" 在 foreach 循环中使用 ncvar_get(ncdf4 包)
Error in { : task 1 failed - "error returned from C call" using ncvar_get (ncdf4 package) within foreach loop
我正在尝试从 .nc 文件中提取数据。由于我的文件中有 7 个变量,我想使用 foreach 循环遍历所有 7 个 ncvar_get 函数。
这是我的代码:
# 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
你能解释一下这段代码有什么问题吗?我认为这与集群无法找到从文件中获取哪个变量这一事实有关,因为 'error returned from C call' 通常来自 ncvar_get varid 参数。
我遇到了同样的问题(相同的错误消息)运行 我的 MacBook Pro (OSX 10.12.5) 上有一个类似的 R 脚本。问题似乎是 foreach 循环中的不同工作人员尝试使用 ncvar_get 同时访问同一个 .nc 文件。这可以通过在 foreach 循环外使用 ncvar_get(将所有数据存储在一个大数组中)并从 foreach 循环内访问该数组来解决。
我在最近购买的工作机器上遇到了同样的问题。但是,相同的代码在我的家庭服务器上运行良好。
不同之处在于,在我的服务器上,我构建了启用并行访问的 netCDF
库(这需要 HDF5
使用某些 MPI 编译器编译)。
我怀疑这个功能可以防止 OP 的错误发生。
编辑:
为了使 NetCDF 具有并行 I/O,首先您需要使用以下参数构建 HDF5:
./configure --prefix=/opt/software CC=/usr/bin/mpicc CXX=/usr/bin/mpicxx FC=/usr/bin/mpifort
然后,在构建 NetCDF C 和 Fortran 库时,您还可以启用并行测试 I/O 以确保一切正常:
./configure -prefix=/opt/software --enable-parallel-tests CC=/usr/bin/mpicc CXX=/usr/bin/mpicxx
(C版)
./configure --prefix=/opt/software --enable-parallel-tests CC=/usr/bin/mpicc FC=/usr/bin/mpifort F77=/usr/bin/mpifort
(Fortran 版本)
当然,要做到这一点,您需要在计算机上安装某种 MPI 库(MPICH、OpenMPI)。
我正在尝试从 .nc 文件中提取数据。由于我的文件中有 7 个变量,我想使用 foreach 循环遍历所有 7 个 ncvar_get 函数。
这是我的代码:
# 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
你能解释一下这段代码有什么问题吗?我认为这与集群无法找到从文件中获取哪个变量这一事实有关,因为 'error returned from C call' 通常来自 ncvar_get varid 参数。
我遇到了同样的问题(相同的错误消息)运行 我的 MacBook Pro (OSX 10.12.5) 上有一个类似的 R 脚本。问题似乎是 foreach 循环中的不同工作人员尝试使用 ncvar_get 同时访问同一个 .nc 文件。这可以通过在 foreach 循环外使用 ncvar_get(将所有数据存储在一个大数组中)并从 foreach 循环内访问该数组来解决。
我在最近购买的工作机器上遇到了同样的问题。但是,相同的代码在我的家庭服务器上运行良好。
不同之处在于,在我的服务器上,我构建了启用并行访问的 netCDF
库(这需要 HDF5
使用某些 MPI 编译器编译)。
我怀疑这个功能可以防止 OP 的错误发生。
编辑:
为了使 NetCDF 具有并行 I/O,首先您需要使用以下参数构建 HDF5:
./configure --prefix=/opt/software CC=/usr/bin/mpicc CXX=/usr/bin/mpicxx FC=/usr/bin/mpifort
然后,在构建 NetCDF C 和 Fortran 库时,您还可以启用并行测试 I/O 以确保一切正常:
./configure -prefix=/opt/software --enable-parallel-tests CC=/usr/bin/mpicc CXX=/usr/bin/mpicxx
(C版)
./configure --prefix=/opt/software --enable-parallel-tests CC=/usr/bin/mpicc FC=/usr/bin/mpifort F77=/usr/bin/mpifort
(Fortran 版本)
当然,要做到这一点,您需要在计算机上安装某种 MPI 库(MPICH、OpenMPI)。