Попытка создать список внутри списка для моего набора данных netcdf

#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 Я только что прочитал описание, и это может быть то, что мне нужно. Большое вам спасибо, я изучу это подробнее!