Я пытаюсь преобразовать вложенный l oop в foreach, чтобы можно было использовать параллельную обработку. Этот l oop извлекает информацию из файлов netCDF на основе списка векторов, которые обозначают положение элементов в netCDF для извлечения. Вот мой пример:
загрузить необходимые пакеты
# devtools::install_github("BigelowLab/fvcom", force = T)
library(fvcom)
library(ncdf4)
library(raster)
library(rgdal)
У меня есть файлы netCDF, сохраненные на жестком диске, но они доступны здесь: https://www.glerl.noaa.gov/data/chrp/Rowe_etal_2019_data/20170530-2/ Для В этом примере я использовал первые 3 файла на этой странице.
setwd("D:/FADR81 netCDF files/example for parallel processing")
file_list <- list.files(pattern = "*.nc")
Создайте список векторов, указывающих положение элементов, которые я хочу извлечь из каждого файла netCDF. Здесь они присвоены произвольно, но на самом деле совпадают с наблюдениями из другого набора данных.
k1 <- 1:10
k2 <- c(1:5, 12:20, 45:51)
k3 <- 200:213
keep <- list(k1, k2, k3)
Запустите l oop, чтобы извлечь время и создать растры температуры и растворенного кислорода.
system.time({
times.all <- character(length(keep[[1]]))
temp.all <- list()
do.all <- list ()
for(i in 1:length(keep)) {
nc <- nc_open(file_list[[i]])
mesh <- get_mesh_geometry(nc, what = 'lonlat')
times <- character(length = length(keep[[i]]))
temp <- list()
do <- list()
for(j in 1:length(keep[[i]])) {
times[j] <- as.character(as.POSIXct(ncvar_get(nc, "Times", start=c(1, keep[[i]][j]), count=c(-1, 1)),
format = "%Y-%m-%dT%H:%M:%S", tz = "UTC"))
temp[[j]] <- get_mesh(nc, vars = "temp", mesh = mesh, time = keep[[i]][j], y = 20)
temp[[j]] <- raster::stack(sapply('temp', function(f) fvcom::rasterize(temp[[j]], field = f), simplify = FALSE))
do[[j]] <- get_mesh(nc, vars = "Dissolved_oxygen", mesh = mesh, time = keep[[i]][j], y = 20)
do[[j]] <- raster::stack(sapply('Dissolved_oxygen', function(f) fvcom::rasterize(do[[j]], field = f), simplify = FALSE))
}
nc_close(nc)
times.all <- c(times.all, times)
temp.all <- c(temp.all, temp)
do.all <- c(do.all, do)
}
times.all2 <- times.all[-which(times.all == '')]
})
Мне нужно l oop более сотни файлов netCDF и извлекать различные элементы из каждого файла. Я надеюсь, что смогу использовать foreach для распараллеливания этого l oop и повышения скорости обработки, но мне не очень повезло с пониманием того, как это сделать. Любая помощь приветствуется.