2012-05-13 2 views
8

Rパッケージncdfを使用して多次元NetCDFファイルを作成しようとしています。私は気象観測で毎年1500ポイントの観測を行い、観測数は18250ポイントです。 問題がnetCDFファイル(create.ncdf)の構造は、これは4GBのを占有し、各点は3つ以上のGb(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

LongvectorとLatvectorの長さはどのくらいですか? seq()を呼び出すか、dput()でそれらを再作成するためのコードをダンプするだけで、それらを提供できますか? – mdsumner

+0

不足している情報を含めるために質問を編集してください。 – mdsumner

+0

は、ncdfが現在廃止されているので、受け入れられた回答ncdf4ソリューションを提案しています - netcdf4の慣例を使用しているソフトウェアの大半。 –

答えて

8

再現不可能なコードにはいくつかのエラーがあり、私の計算ではファイルは219Mb(1500 * 18250 * 8バイト)です。

library(ncdf) 

Countが寸法の指標ではなく、軸の位置値であるので、我々はstartを修正

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

少なくとも一つのスライスと一致するように、最初の二つ薄暗くなり用ベクターおよびデータセットを提供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

は、ここでR用NetCDF4パッケージ(ncdf4)で動作しますmdsumnerの答えの更新バージョンです。

# 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) 
関連する問題