首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >{:任务1失败中的错误--使用ncvar_get (ncdf4包)在foreach循环中使用“C调用返回的错误”

{:任务1失败中的错误--使用ncvar_get (ncdf4包)在foreach循环中使用“C调用返回的错误”
EN

Stack Overflow用户
提问于 2018-04-09 16:54:17
回答 2查看 761关注 0票数 2

我正在尝试从.nc文件中提取数据。因为我的文件中有7个变量,所以我想使用foreach循环ncvar_get函数。

这是我的代码:

代码语言:javascript
复制
 # 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)

错误是:

代码语言:javascript
复制
Error in { : task 1 failed - "error returned from C call"
Calls: %dopar% -> <Anonymous>
Execution halted

你能解释一下这段代码有什么问题吗?我认为这与集群无法从文件中获取哪个变量有关,因为‘从C调用返回的错误’通常来自ncvar_get变量参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-08 14:34:48

在我的MacBook Pro (OSX10.12.5)上运行类似的R脚本时,我也遇到了同样的问题(相同的错误消息)。问题似乎在于,来自foreach循环的不同工作人员试图同时使用ncvar_get访问同一个ncvar_get文件。这可以通过在foreach循环之外使用ncvar_get (将所有数据存储在一个大数组中)并从foreach循环中访问该数组来解决。

票数 2
EN

Stack Overflow用户

发布于 2020-06-08 16:45:36

在最近买来的一台机器上,我也遇到了同样的问题。但是,相同的代码在我的主服务器上运行良好。

不同之处在于,在我的服务器上,我构建了启用并行访问的netCDF库(这需要用一些MPI编译器编译的HDF5 )。

我怀疑这个特性可以防止OP的错误发生。

编辑

为了使NetCDF具有paralel /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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49737931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档