#r #for-loop #netcdf
#r #for-цикл #netcdf
Вопрос:
Я очень новичок в R и в настоящее время работаю с большим количеством файлов NARR netcdf для моего проекта. Изначально я пытался объединить их все, чтобы иметь дело только с одним файлом, но пытался преобразовать их из 3d в 2d массив, используя этот один большой файл, занимающий почти 64 ГБ оперативной памяти. Из-за ограничения моей оперативной памяти мне посоветовали перебирать несколько файлов netcdf (по 200 МБ) каждый вместо извлечения информации из объединенного файла (33 ГБ).
Моя цель — извлечь переменную (например, конвективную доступную потенциальную энергию (CAPE)) для определенных наборов координат. Я использовал функцию over () из библиотеки rgdal и успешно извлек индексы. Ниже приведен код для извлечения индексов для каждого шейп-файла и сохранения их в список (all_ind).
can_coor <- #csv file with NARR coordinates
coordinates(can_coor) <-~ Lon Lat # to make them into spatial points
get_ind <- function(x){
x <- readOGR(x)
proj4string(can_coor) <- proj4string(x) #to have consistent projection
tor_ind <- over(x, can_coor)
}
files <- list.files(filepath, pattern = ".shp$", full.names = T, all.files = F)
all_ind <- lapply(files, get_ind)
Затем я пытаюсь применить каждый набор индексов lon и lat all_ind[[i]] к файлу netcdf, чтобы извлечь значения из всех временных меток для этих конкретных координат и сохранить их в новом списке.
Поскольку у меня есть ограничение на мою оперативную память, я планирую создать цикл для чтения каждого файла netcdf, а затем извлечь все значения для этих индексов и сохранить их в отдельный список. Итак, в итоге в моем списке будет [[1:30]] (для 30 файлов netcdf), а внутри этого [[1:30]] у меня будет [[1: 239]] (для 239 наборов индексов, которые я извлекаю).
Я придумал следующий цикл for, но я не уверен, как это исправить, чтобы получить желаемые результаты.
var_list <- list()
for(i in 1:length(all_ind)){
fileL <- list.files("netcdf file path", pattern = ".nc$", full.names = T, all.files = F)
n <- nc_open(fileL)
for (j in 1:length(n)) {
data <- ncvar_get(n, "cape")
data <- matrix(data, dim(data)[3],dim(data)[1]*dim(data)[2]) #time as rows for easier filtration
subset_data <- data[,all_ind[[i]]]
var_list[[i]] <- subset_data
}
all_var_list[[i]] <- var_list
}
Любые советы будут оценены. Спасибо!
Комментарии:
1. могу ли я предложить
disk.frame
библиотеку? cran.r-project.org/web/packages/disk.frame/readme/README.html это более долгосрочное решение2. @D.J Я только что прочитал описание, и это может быть то, что мне нужно. Большое вам спасибо, я изучу это подробнее!