आर

2012-05-13 26 views
8

में बहु-आयामी नेटसीडीएफ बनाना, मैं आर पैकेज ncdf का उपयोग कर बहु-आयामी नेटसीडीएफ फ़ाइल बनाने की कोशिश कर रहा हूं। मैं 1500 अंक के सेट के लिए जलवायु दैनिक अवलोकन के साथ काम कर रहा हूं, प्रत्येक बिंदु के लिए टिप्पणियों की संख्या ~ 18250 है। समस्या यह है कि NetCDF फ़ाइल (create.ncdf) की संरचना 4Gb पर है और प्रत्येक बिंदु अधिक से अधिक 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 लंबी और अक्षांश प्रत्येक बिंदु के लिए के साथ मैट्रिक्स से लिया वैक्टर हैं। डेटासेट एक सूची प्रारूप है और प्रत्येक बिंदु के लिए मेरे पास संख्यात्मक मानों की एक सूची है।

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

क्या मुझे कुछ याद आ रहा है या मुझे अन्य पैकेजों का प्रयास करना चाहिए ??

+0

लॉन्गवेक्टर और लैटवेक्टर की लंबाई क्या हैं? क्या आप उन्हें प्रदान कर सकते हैं, शायद seq() के लिए कॉल के साथ या डंप() के साथ उन्हें फिर से बनाने के लिए कोड डंप करें। – mdsumner

+0

कृपया लापता सूचना को शामिल करने के लिए प्रश्न संपादित करें – mdsumner

+0

स्वीकार्य उत्तर एनसीडीएफ 4 समाधान को आगे बढ़ाने का सुझाव देगा क्योंकि एनसीडीएफ अब अप्रचलित हो रहा है - नेटकडीएफ 4 सम्मेलनों का उपयोग कर सॉफ्टवेयर का बहुमत। –

उत्तर

8

आपके गैर-पुनरुत्पादित कोड में कुछ त्रुटियां हैं, और मेरी गणना के अनुसार फ़ाइल 21 9 एमबी (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, और तीसरे आयाम की गणना (लंबाई) का उपयोग करें (-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

यहाँ जो आर के लिए 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)