簡體   English   中英

{ 中的錯誤:任務 1 失敗 - 在 foreach 循環中使用 ncvar_get(ncdf4 包)“從 C 調用返回的錯誤”

[英]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

你能解釋一下這段代碼有什么問題嗎? 我認為這與集群無法找出從文件中獲取哪個變量有關,因為“從 C 調用返回的錯誤”通常來自 ncvar_get varid 參數。

我在 MacBook Pro (OSX 10.12.5) 上運行類似的 R 腳本時遇到了同樣的問題(相同的錯誤消息)。 問題似乎是來自 foreach 循環的不同工作人員嘗試使用 ncvar_get 同時訪問相同的 .nc 文件。 這可以通過在 foreach 循環外使用 ncvar_get(將所有數據存儲在一個大數組中)並從 foreach 循環內訪問該數組來解決。

我在最近購買的工作機器上遇到了同樣的問題。 但是,相同的代碼在我的家庭服務器上運行良好。

不同之處在於,在我的服務器上,我構建了啟用並行訪問的netCDF庫(這需要使用某些 MPI 編譯器編譯的HDF5 )。

我懷疑這個功能可以防止 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)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM