Я пытался вычислить среднемесячные значения 8-дневных данных MODIS, но вычисление среднего значения занимает очень много времени. Есть ли более быстрый способ сделать это. Я использую следующий код, чтобы сделать это в R:
library(doParallel)
library(foreach)
library(raster)
# Set the number of cores to use for parallel processing
ncores <- parallel::detectCores() - 1 # Use all available cores except one
registerDoParallel(cores = ncores)
m<-stack()
foreach (month_name = month.name) %dopar% {
print(month_name)
# Subset layers corresponding to the current month
month_layers <- s[[which(months(getZ(s)) == month_name)]]
print(month_layers)
# Calculate mean for the month (exclude NA values)
month_mean <- mean(month_layers, na.rm = TRUE)
print(month_mean)
# Store the monthly mean in the list with the month name as the list element name
m<-stack(m,month_mean)
}
я бы сделал
library(terra)
x <- rast(files)
m <- tapp(x, "months", mean, cores=ncores)
Спасибо. Оно работало завораживающе. Я хочу добавить сюда одну вещь. потому что у меня были файлы в виде стека растров, и преобразование стека в SpatRaster привело к потере дат. И я думаю, что синонимами «getZ» и «setZ» в Терре является «время». Имея это в виду, мне пришлось добавить следующее: x<-rast(raster_stack) time(x)<- date_vector #vector of date
Лично я избегаю загрузки данных (стека) в основной процесс, так как их необходимо отправить работникам, чтобы они могли работать. По крайней мере, отправляйте подмножества вместо подмножества в параллельном цикле. Я предпочитаю загружать данные в цикле и либо возвращать результат, либо сохранять их в отдельных файлах, чтобы не перегружать память.