2012-05-13 5 views
8

Я пытаюсь создать многомерный файл NetCDF с использованием пакета R ncdf. Я работаю с климатическими ежедневными наблюдениями за набор в 1500 пунктов, количество наблюдений составляет ~ 18250 для каждой точки. Проблема состоит в том, что структура файла NetCDF (create.ncdf) занимает 4Gb и каждая точка делает размер файла увеличение более чем на 3 Гб (put.var.ncdf)Создание многомерного NetCDF в R

Это код я использую:

# 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 и Latvector векторы взяты из матрицы с длинным и Шир для каждой точки. Набор данных - это формат списка, и для каждой точки у меня есть список числовых значений.

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

Я что-то упустил или должен попробовать другие пакеты?

+0

Какова длина длинного и латектора? Можете ли вы предоставить их, возможно, с вызовом seq() или просто кодом дампа, чтобы воссоздать их с помощью dput(). – mdsumner

+0

Пожалуйста, отредактируйте этот вопрос, чтобы включить недостающую информацию. – mdsumner

+0

предложит переносить принятое решение ncdf4 с принятым ответом, поскольку ncdf теперь устаревает - большая часть программного обеспечения, использующего соглашения netcdf4. –

ответ

8

В вашем невоспроизводимом коде есть ошибки, и, по моему мнению, файл 219Mb (1500 * 18250 * 8 байт).

library(ncdf) 

Обеспечить векторы для первых двух тускнеет и набора данных, чтобы соответствовать, по меньшей мере один срез

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

граф является индексом размерности, а не значение положения оси, поэтому мы исправить start к 1, и используйте счетчик (длина) 3-го измерения (не -1).

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

close.ncdf(nc) 

Опросить размер файла.

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

Вот обновленный вариант ответа mdsumner, который работает с пакетом NetCDF4 для 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) 
Смежные вопросы