J'ai un problème de mémoire lié à la fonction as.matrix
Suivant les conseils de la doc (https://www.rdocumentation.org/packages ... /as.matrix) j'aimerais utiliser les fonctions getValues ou getValuesBlock en espérant que cela résolve mon problème mais je ne sais pas trop comment m'y prendre.
L'erreur concernant la mémoire arrivait à la partie du script suivante :
##Obtenir une seule couche de données, créer un dataframe sur R et écrire un fichier .csv
# obtenir une seule tranche de données
temp_slice <- temp_array[4]
# Création du dataframe -- remodeler les données
# matrix (nlon*nlat rows by 2 cols) of lons and lats
## Permet de créer la matrice avec une colonne lat et lon
lonlat <- as.matrix(expand.grid(lon,lat))
dim(lonlat)
Erreur : impossible d'allouer un vecteur de taille 980,0 Go
Execution arrêtée
Mon script est le suivant :
Code : Tout sélectionner
#Script_test_extraire_temperature_netcdf
#Library
library(ncdf4)
#Charger rep.de travail
setwd("/gpfs/home/...")
dir()
#Ouverture du fichier netCDF
nc <-nc_open("nom_du_fichier.nc")
print(nc)
##Obtenir les coordonnées x, y de la variable
#obtenir la longitude
lon <- ncvar_get(nc,"longitude")
nlon <- dim(lon)
dim(lon) #donne la taille du vecteur
head(lon) #montre les données de longitude
#obtenir la latitude
lat <- ncvar_get(nc,"latitude")
nlat <- dim(lat)
dim(lat) #donne la taille du vecteur
head(lat) #montre les données de latitude
print(c(nlon,nlat)) #pour vérif. le nb de valeurs contenues dans les 2 dim.
# Obtenir le temps
time <- ncvar_get(nc,"time")
# Obtenir le temps + unité
tunits <- ncatt_get(nc,"time","units")
tunits
#Obtenir la variable température "TEMP"
dname <- "TEMP"
dname
# Obtenir la température
##Présente la matrice de données
temp_array <- ncvar_get(nc,dname)
dlname <- ncatt_get(nc,dname,"long_name") #"long_name" c'est la façon dont est nommée TEMP
dlname
dunits <- ncatt_get(nc,dname,"units")
dunits
##Indique le nombre de valeurs
fillvalue <- ncatt_get(nc,dname,"_FillValue")
fillvalue
dim(temp_array)
print(temp_array)
# Echelle de la temperature
min(na.omit(as.vector(temp_array[4])))
max(na.omit(as.vector(temp_array[4])))
# Fermer le netCDF
nc_close (nc)
##Obtenir une seule couche de données, créer un dataframe sur R et écrire un fichier .csv
# obtenir une seule tranche de données
temp_slice <- temp_array[4]
# Création du dataframe -- remodeler les données
# matrix (nlon*nlat rows by 2 cols) of lons and lats
## Permet de créer la matrice avec une colonne lat et lon
lonlat <- as.matrix(expand.grid(lon,lat))
dim(lonlat)
# vecteur de valeurs `temperature`
temp_vec <- as.vector(temp_slice)
length(temp_vec)
# Créer un dataframe et ajouter des noms
## On colle notre matrice avec lon et lat au vecteur temp
temp_df01 <- data.frame(cbind(lonlat,temp_vec))
## Dans sep ="" indiquer le nom de notre variable, ici temp
names(temp_df01) <- c("longitude","latitude", sep="TEMP")
##Permet de voir les 10 premières lignes notre tableau sans les NA
head(na.omit(temp_df01), 10)
#Sélection de la zone d’étude d’un point de vue spatial
#La fonction subset, est utilisée afin de ce centrer sur la zone souhaité et ainsi réduire le poids du fichier csv final
##Sélectionner une zone spatiale
## Ici on indique la zone spatiale de la Corse
temp_df01 <- subset(temp_df01, lon >= 8 & lon <= 10.5)
temp_df01 <- subset(temp_df01, lat >= 41 & lat <= 43.5)
##Ecrire le dataframe
#la trame de données est écrite dans le répertoire de travail sous forme de fichier .csv, en utilisant à nouveau na.omit () pour supprimer les observations avec des données manquantes.
# définir le chemin et le nom de fichier
csvpath <- "/gpfs/home/UDCPP/barrier_c/Test_CMS/data_brut/MENOR1200/V10-SN/2017"
##Ici, on peu remplacer csv par .txt si on veut un format texte
csvname <- "Temp.csv"
csvfile <- paste(csvpath, csvname, sep="")
write.table(na.omit(temp_df01),csvfile, row.names=FALSE, sep=",")
##Vérifier les données
#Afin de vérifier notre .csv, nous allons réaliser un raster des données de temperature
#Librairie
library(ggplot2)
setwd("/gpfs/home/UDCPP/barrier_c/Test_CMS/data_brut/MENOR1200/V10-SN/2017")
test <- read.csv("Temp.csv", header = T, sep =",")
ggplot(data = test, aes(x = lon, y = lat, fill = temp)) +
geom_raster(interpolate = TRUE) +
scale_fill_viridis_c(begin = 0, end =1) +
theme_bw() +
coord_fixed(1.3)
Mon fichier se trouve ici > https://drive.google.com/file/d/1siVwKquNLrr7vsJBXfwLCS7mNKCty_AI/view?usp=sharing
Mon objectif est de pouvoir exprimer les température du fichier (la variable TEMP), chaque jour, dans un graphe ou un dataframe en sortie .csv ou .txt
Merci pour votre aide/vos conseils !