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

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

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

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

Longvector и Latvector - векторы, взятые из матрицы с Long и Lat для каждой точки. Набор данных представляет собой формат списка, и для каждой точки у меня есть список числовых значений.

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

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

 mdsumner17 мая 2012 г., 08:08
Пожалуйста, измените вопрос, чтобы включить недостающую информацию
 mdsumner17 мая 2012 г., 07:54
Каковы длины Longvector и Latvector? Можете ли вы предоставить их, возможно, с помощью вызова seq () или просто сбросить код, чтобы воссоздать их с помощью dput ().
 Adrian Tompkins06 окт. 2017 г., 11:46
предложил бы перенести принятый ответ на решение ncdf4, так как ncdf сейчас устарел - большинство программного обеспечения используют соглашения netcdf4.

Ответы на вопрос(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))

Count - это индекс размера, а не значение позиции оси, поэтому мы исправляемstartт @ до 1, и используйте количество (длину) третьего измерения (не -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

который работает с пакетом 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)
 LuluPor23 авг. 2018 г., 04:21
Так в: # Определить набор данных = список (1: 18250) мы передаем список сеток?
 MikeRSpencer23 авг. 2018 г., 09:32
Да. Вроде. Это индекс для временных шагов.

Ваш ответ на вопрос