Создание многомерного NetCDF в R

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

Это код, который я использую:

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

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

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


person Gago-Silva    schedule 13.05.2012    source источник
comment
Каковы длины Лонгвектора и Лавектора? Можете ли вы предоставить их, возможно, с помощью вызова seq() или просто дампа кода, чтобы воссоздать их с помощью dput().   -  person mdsumner    schedule 17.05.2012
comment
Пожалуйста, отредактируйте вопрос, чтобы включить недостающую информацию   -  person mdsumner    schedule 17.05.2012
comment
предложил бы перенести принятое решение ncdf4 для ответа, поскольку ncdf сейчас устаревает - большинство программного обеспечения сейчас использует соглашения netcdf4.   -  person Adrian Tompkins    schedule 06.10.2017


Ответы (2)


В вашем невоспроизводимом коде есть некоторые ошибки, и, по моим подсчетам, размер файла составляет 219 МБ (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
person mdsumner    schedule 17.05.2012