2012-05-13 13 views
8

Sto cercando di creare un file NetCDF multidimensionale utilizzando il pacchetto R ncdf. Sto lavorando con osservazioni giornaliere climatiche per un set di 1500 punti, il numero di osservazioni è ~ 18250 per ogni punto. Il problema è che la struttura del file NetCDF (create.ncdf) occupa 4Gb e ciascun punto rende la dimensione del file di aumento di più del 3 Gb (put.var.ncdf)Creazione di NetCDF multidimensionale in R

Questo è il codice che sto usando:

# Make a few dimensions we can use 
dimX <- dim.def.ncdf("Long", "degrees", Longvector) 
dimY <- dim.def.ncdf("LAT", "degrees", Latvector) 
dimT <- dim.def.ncdf("Time", "days", 1:18250, unlim=FALSE) 

# Make varables of various dimensionality, for illustration purposes 
mv <- -9999 # missing value to use 
var1d <- var.def.ncdf("var1d", "units", dimX, mv,prec="double") 
var2d <- var.def.ncdf("var2d", "units", list(dimX,dimY), mv,prec="double") 
var3d <- var.def.ncdf("var3d", "units", list(dimX,dimY,dimT), mv,prec="double") 

# Create the test file 
nc <- create.ncdf("writevals.nc", list(var1d,var2d,var3d)) 
# !!Creates a nc file with + 4 Gb 

# Adding the complete time series for one point (the first point in the list of the dataset) 
put.var.ncdf(nc, var3d,dataset[[1]], start=c(Longvector[1],Latvector[1],1),   count=c(1,1,-1)) 

Longvector e Latvector sono vettori presi dalla matrice con la lunga e Lat per ogni punto. Il set di dati è un formato elenco e per ogni punto ho un elenco di valori numerici.

dataset[[1]]=c(0,0,0,9.7,0,7.5,3.6,2.9,0,0.5,....) 

Mi manca qualcosa o devo provare altri pacchetti ??

+0

Quali sono le lunghezze di Longvector e Latvector? Puoi fornirli, magari con una chiamata a seq() o semplicemente eseguire il dump del codice per ricrearli con dput(). – mdsumner

+0

Si prega di modificare la domanda per includere le informazioni mancanti – mdsumner

+0

suggerirebbe di spostare risposta accettata soluzione ncdf4 come ncdf ora sta diventando obsoleto - la maggior parte del software che utilizza convenzioni netcdf4 ora. –

risposta

8

Ci sono alcuni errori nel codice non riproducibile, e dal mio conto il file è 219Mb (1500 * 18250 * 8 byte).

library(ncdf) 

fornire i vettori per i primi due affievolisce e il set di dati in modo che corrisponda almeno una fetta

Longvector = seq(-180, 180, length = 50) 
Latvector = seq(-90, 90, length = 30) 
dataset <- list(1:18250) 

dimX <- dim.def.ncdf("Long", "degrees", Longvector) 
dimY <- dim.def.ncdf("LAT", "degrees", Latvector) 
dimT <- dim.def.ncdf("Time", "days", 1:18250, unlim = FALSE) 

mv <- -9999 
var1d <- var.def.ncdf("var1d", "units", dimX, mv,prec="double") 
var2d <- var.def.ncdf("var2d", "units", list(dimX,dimY), mv,prec="double") 
var3d <- var.def.ncdf("var3d", "units", list(dimX,dimY,dimT), mv,prec="double") 

nc <- create.ncdf("writevals.nc", list(var1d,var2d,var3d)) 

Count è l'indice della dimensione, non il valore di posizione dell'asse, quindi abbiamo correggere start a 1, e usa il conteggio (lunghezza) della terza dimensione (non -1).

put.var.ncdf(nc, var3d, dataset[[1]], start = c(1, 1, 1), count = c(1, 1, length(dataset[[1]]))) 

close.ncdf(nc) 

Interrogare la dimensione del file.

file.info("writevals.nc")$size/1e6 
[1] 219.0866 
3

Ecco una versione aggiornata della risposta di mdsumner che funziona con il pacchetto NetCDF4 per R (ncdf4).

# Open library 
library(ncdf4) 

# Get x and y vectors (dimensions) 
Longvector = seq(-180, 180, length = 50) 
Latvector = seq(-90, 90, length = 30) 
# Define data 
dataset = list(1:18250) 

# Define the dimensions 
dimX = ncdim_def("Long", "degrees", Longvector) 
dimY = ncdim_def("Lat", "degrees", Latvector) 
dimT = ncdim_def("Time", "days", 1:18250) 

# Define missing value 
mv = -9999 

# Define the data 
var1d = ncvar_def("var1d", "units", dimX, mv, prec="double") 
var2d = ncvar_def("var2d", "units", list(dimX,dimY), mv, prec="double") 
var3d = ncvar_def("var3d", "units", list(dimX,dimY,dimT), mv, prec="double") 

# Create the NetCDF file 
# If you want a NetCDF4 file, explicitly add force_v4=T 
nc = nc_create("writevals.nc", list(var1d, var2d, var3d)) 

# Write data to the NetCDF file 
ncvar_put(nc, var3d, dataset[[1]], start=c(1, 1, 1), 
    count=c(1, 1, length(dataset[[1]]))) 

# Close your new file to finish writing 
nc_close(nc) 
Problemi correlati