Messagepar Laure Trudel » 06 Mar 2019, 00:54
Je vais expliquer les différentes étapes de ma démarche pour que ça osir plus claire. Peut-être que vous pourrez m'aider à améliorer mon code pour avoir des fichiers moins gros ou changer des choses pour que ça soit plus efficace.
1. J'ai deux types de fichier netcdf que je veux regrouper mais qui n'ont pas les même dimensions. J'ai donc une première étape qui est de regrouper plusieurs fichiers netcdf , qui ont été préalablement reprojeté sur une grille « modèle » aux dimensions de l'autre type de fichier. netcdf. Ces fichiers netcdf sont sélectionnés selon des années et des mois données avec un fichier par jour. J'ai donc beaucoup de fichiers.
Je fais donc des rasterstacks.
Pour obtenir le premier RasterStack, voilà mon code :
mt <-c("/06","/07","/08","/09","/10","/11") #les mois que je sectionne pour les différentes années
l2000 <- list.files(path= paste("D:/PostDoc_MML/Data/SST_all/",sele_2000,sep="/"), full.names = TRUE) ;l2000 #fichiers netcdf pour chaque jour du mois sectionnée, d'une année donnée
b2000 <- NULL
for(e in mt){
b20 <- l2000[grep(e, l2000)]
b2000 <- c(b2000,b20)
}
b2000 #fichiers selectionnés
r2resampled.a <- stack()
for(j in b2000){
setwd(j)
print(j)
l2 <- list.files(path= paste(j,sep="/"), full.names = TRUE) ;l2
for(jj in l2) {
r2resampled <- projectRaster(raster(jj),r1,method = 'ngb')
r2resampled.a <- raster::stack(r2resampled.a, r2resampled)
}
}
r2resampled.a #Rasterstack obtenu de 11.3 Gb c'est lui qui est vraiment très gros.
J'ai essayé de le mettre en RasterBrick mais je n'y arrive pas car j'ai encore des problèmes de mémoire.
2. Ensuite je regroupe les autres fichiers netcdf avec la même démarche mais sans les redimensionner puisque que je m'appuie sur leurs dimensions pour le raster "modèle" de l'étape précédente.
J'obtiens un autre RasterStack qui est moins gros 15Mb
Le code est le suivant:
l2011 <- list.files(path= paste("F:/PostDoc_MML/Data/SST_Copernicus_Ostia_JB/",sele_2011,sep="/"), full.names = TRUE) ;l2011
b2011 <- NULL
for(e in mt){
b11 <- l2011[grep(e, l2011)]
b2011 <- c(b2011,b11)
}
b2011 #fichiers sélectionnés
############################################
sst.all.a <- stack()
for (i in b2011) {
setwd(i)
print(i)
l <- list.files(pattern = "nc", full.names = TRUE)
sst <- raster::stack(l, varname = "analysed_sst")
sst.all.a <- stack(sst.all.a, sst)
}
sst.all.a #RasterStack obtenu
3. je regroupe les 2 RasterStack et que je calcule la moyenne .
sst.all.a.tot <- stack(sst.all.a,r2resampled.a)#
sst_mean.a <- calc(sst.all.a, mean, na.rm= T) ; sst_mean.a
ou
sst.mean.2 <- (sst.all.a + r2resampled.a) / 2
J'ai essayé les 2 méthodes mais ça ne passe au niveau de la mémoire !
J'ai essayé de supprimer les 2 RasterStacks après en avoir formé qu'un seul ça ne passe pas. J'ai utilisé memory.limit pour augmenter la taille de mémoire "size=12884901888" comme je l'ai dit dans mes précédents emails mais ça ne passe pas.
Ma question est donc avez vous une suggestion de code pour ne pas avoir des objets aussi gros et arriver à faire cette moyenne ou des suggestions pour améliorer mon code car peut-être que le problème vient de là. Le but final est d'extraire des valeurs souhaitées sur le raster final.
Peut-être qu'avec le package netcdf4 ça passerai mais je ne sais pas comment faire.
Merci d'avance,