2012-05-13 14 views
8

Ich versuche, eine multidimensionale NetCDF-Datei mit dem R-Paket ncdf zu erstellen. Ich arbeite mit klimatischen Tagesbeobachtungen für eine Menge von 1500 Punkten, die Anzahl der Beobachtungen beträgt ~ 18250 für jeden Punkt. Das Problem ist, dass die Struktur der NetCDF Datei (create.ncdf) einnimmt 4 GB und jeder Punkt macht die Größe der Datei um mehr als 3 Gb (put.var.ncdf)Erstellen multidimensionalen NetCDF in R

Dies ist der Code ich verwende:

# 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 und Latvector sind Vektoren, die aus der Matrix mit dem langen und Lat für jeden Punkt genommen. Der Datensatz ist ein Listenformat und für jeden Punkt habe ich eine Liste mit numerischen Werten.

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

Bin ich etwas fehlt oder sollte ich andere Pakete versuchen ??

+0

Was sind die Längen von Longvector und Latvector? Können Sie sie bereitstellen, vielleicht mit einem Aufruf von seq() oder einfach nur Code ausgeben, um sie mit dput() neu zu erstellen. – mdsumner

+0

Bitte bearbeiten Sie die Frage, um die fehlenden Informationen einzuschließen. – mdsumner

+0

würde vorschlagen, die akzeptierte Antwort ncdf4 Lösung zu übernehmen, da ncdf jetzt veraltet ist - die Mehrheit der Software verwendet jetzt netcdf4 Konventionen. –

Antwort

8

Es gibt einige Fehler in Ihrem nicht reproduzierbaren Code, und meiner Meinung nach ist die Datei 219 MB (1500 * 18250 * 8 Bytes).

library(ncdf) 

die Vektoren für die ersten beiden dims vorzusehen und die Daten-Set mindestens eine Scheibe

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 entsprechen der Index der Dimension ist, nicht der Wert Achsposition, so dass wir korrigieren start zu 1 und verwende die Anzahl (Länge) der 3. Dimension (nicht -1).

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

close.ncdf(nc) 

Die Dateigröße abfragen.

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

Hier ist eine aktualisierte Version der Antwort des mdsumner, die für R (ncdf4) mit dem NetCDF4 Paket funktioniert.

# 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)