所以我试图使用大量的netcdf数据为我正在工作的一个项目。这需要我遍历大约288个文件,提取温度数据,取平均值,然后绘制出来。然而,我是R的新手,感觉我使用的方法效率低得令人难以置信。
注意,当我使用10个文件时,这个方法工作得很好。直觉上我知道这将是非常慢的,但我缺乏R知识阻碍了我使它更有效率。
setwd('path')
#Picks out files that start with grid_T
temp = list.files(pattern='grid_T*')
#Opens all files and stores each in a list
myfiles = lapply(temp,nc_open)
#Creates empty temperature array with 4 dimensions to store temperature data (temperature data for each day is 1442x398x75)
temperature <- array(dim=c(1442,398,75,length(myfiles)))
#Loops through each file and pulls out temperature data and closes when done.
for (i in 1:length(myfiles)){
temperature[,,,i] <- ncvar_get(myfiles[[i]],"votemper")
cat("File", i,"temperature extractedn")
nc_close(myfiles[[i]])
}
一段时间后返回错误
错误:无法分配大小为92.4 Gb的向量
我可以想到一些解决方案,但似乎无法实现它们:
- 在提取循环中,打开每个文件,提取数据,然后关闭文件,而不是首先打开所有文件(这些文件不只是包含温度,它们还包含许多其他变量) 我实际上不需要每个条目。我只需要入口温度[94:1009,151:323,1]。因此,如果有一种方法可以提取这个,它将大大减少操作的数量。
也许你可以尝试像这样一次打开一个文件
# list of file names
temp = list.files(pattern='grid_T*')
temperature <- array(dim=c(1442,398,75,length(temp)))
for (i in 1:length(temp)){
# open ith file
nc_file <- nc_open(temp[i])
# do whatever
temperature[,,,i] <- ncvar_get(nc_file,"votemper")
cat("File", i,"temperature extractedn")
# close file
nc_close(nc_file)
}