2012-05-13 29 views
8

Tôi đang cố gắng tạo tệp NetCDF đa chiều sử dụng gói R ncdf. Tôi đang làm việc với các quan sát khí hậu hàng ngày cho một bộ 1500 điểm, số quan sát là ~ 18250 cho mỗi điểm. Vấn đề là cấu trúc của tập tin NetCDF (create.ncdf) chiếm 4Gb và mỗi điểm làm cho kích thước của tập tin bằng cách tăng hơn 3 Gb (put.var.ncdf)Tạo NetCDF đa chiều trong R

Đây là mã tôi đang sử dụng:

# 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 và Latvector là véc tơ lấy từ ma trận với Long và Lat cho mỗi điểm. Tập dữ liệu là một định dạng danh sách và cho mỗi điểm tôi có một danh sách các giá trị số.

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

Tôi có thiếu gì đó hoặc tôi nên thử các gói khác không ??

+0

Độ dài của Longvector và Latvector là bao nhiêu? Bạn có thể cung cấp cho họ, có lẽ với một cuộc gọi đến seq() hoặc chỉ cần đổ mã để tạo lại chúng với dput(). – mdsumner

+0

Vui lòng chỉnh sửa câu hỏi để bao gồm thông tin còn thiếu – mdsumner

+0

sẽ đề xuất di chuyển giải pháp ncdf4 đã được chấp nhận vì ncdf hiện đang trở nên lỗi thời - phần lớn phần mềm sử dụng quy ước netcdf4 ngay bây giờ. –

Trả lời

8

Có một số lỗi trong mã không thể tái sản xuất của bạn và do tôi tính toán tệp là 219Mb (1500 * 18250 * 8 byte).

library(ncdf) 

Cung cấp các vectơ cho hai dims đầu tiên và tập dữ liệu để phù hợp với ít nhất một lát

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

Đếm là chỉ số của kích thước, không phải là trục giá trị vị trí, vì vậy chúng tôi sửa start để 1, và sử dụng số lượng (chiều dài) của chiều thứ 3 (không -1).

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

close.ncdf(nc) 

Tra cứu kích thước tệp.

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

Đây là phiên bản cập nhật của câu trả lời của mdsumner hoạt động với gói NetCDF4 cho 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)