r - 错误于{: task 1 failed - "error returned from C call" using ncvar_get (ncdf4 package) within foreach loop

标签 r foreach error-handling ncdf4

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

这是我的代码:

 # 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 循环内访问该数组来解决。

显然,另一种解决方案是在 foreach 循环中适当拆分 .nc 文件,然后访问不同的 .nc 文件。这应该会降低内存消耗,因为可以避免将大数组复制到每个工作线程。

关于r - 错误于{: task 1 failed - "error returned from C call" using ncvar_get (ncdf4 package) within foreach loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49737931/

相关文章:

r - 在 R 中, `is.list(x)` 和 `is(x,' 列表之间的不同行为')`

c++ - 我可以通过 for_each <algorithm> 在 C++ 中的指针 vector 上调用 `delete` 吗?

parsing - 覆盖 "Internal Happy Error"- notHappyAtAll

node.js - 查看管道错误中的管道数据

django - Django中的错误响应

r - 检查非有限值的大型稀疏矩阵的有效方法

r - R 中 Kmeans 的一致簇顺序

r - 在 grid.arrange 中绘制图例、间隔良好的通用 y 轴和主标题

c# - 如何检查拆分容器内的所有文本框?

Java 8 | HashMap 的并行流