2012-05-13 30 views
8

Estoy tratando de crear un archivo NetCDF multidimensional utilizando el paquete R ncdf. Estoy trabajando con observaciones climáticas diarias para un conjunto de 1500 puntos, el número de observaciones es ~ 18250 para cada punto. El problema es que la estructura del archivo de NetCDF (create.ncdf) ocupa 4 Gb y cada punto hace que el tamaño de la ampliación de archivo por más de 3 Gb (put.var.ncdf)Creación de NetCDF multidimensional en R

Este es el código que estoy utilizando:

# 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 y Latvector son vectores tomadas de la matriz con la larga y Lat para cada punto. El conjunto de datos es un formato de lista y para cada punto tengo una lista de valores numéricos.

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

¿Falta algo o debo probar otros paquetes?

+0

¿Cuáles son las longitudes de Longvector y Latvector? ¿Puede proporcionarlos, tal vez con una llamada a seq() o simplemente volcar código para recrearlos con dput(). – mdsumner

+0

Por favor, edite la pregunta para incluir la información que falta – mdsumner

+0

sugeriría mover la solución aceptada de respuesta ncdf4 como ncdf ahora se está volviendo obsoleta - la mayoría del software usa las convenciones de netcdf4 ahora. –

Respuesta

8

Hay algunos errores en su código no reproducible, y según mis cálculos el archivo es 219Mb (1500 * 18250 * 8 bytes).

library(ncdf) 

ofrecen los vectores para los dos primeros se atenúa y el conjunto de datos para que coincida con al menos una rebanada

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 es el índice de la dimensión, no el valor de posición del eje, por lo que corregir start a 1, y usa el recuento (longitud) de la tercera dimensión (no -1).

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

close.ncdf(nc) 

Interrogue el tamaño del archivo.

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

Aquí es una versión actualizada de la respuesta de mdsumner que trabaja con el paquete NetCDF4 para 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) 
Cuestiones relacionadas