diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7ffeff --- /dev/null +++ b/.gitignore @@ -0,0 +1,216 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +__private__/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/pyncf.py b/pyncf.py index 5b9b97d..230931e 100644 --- a/pyncf.py +++ b/pyncf.py @@ -597,6 +597,11 @@ def read_2d_data(self, varname, xdim="longitude", ydim="latitude", **extradims): # TODO: allow extradims to reference the actual dimension values by looking it up in its coordinate variable values # ... + # TODO OPTIMIZATION: alternatively find the byte interval between every value to be read, + # and instead batch read all values at once using a slice with a step value, + # potentially implemented via a memoryview for optimal efficiency. + # ... + # find each value one at a time by computing offsets # TODO: calculate number of records if numrecs is STREAMING begin = varinfo["begin"] @@ -651,7 +656,7 @@ def read_2d_data(self, varname, xdim="longitude", ydim="latitude", **extradims): elif dtype == "NC_DOUBLE": value = self.read_double(n) - # TODO: handle fill values + # TODO: handle fill values? # ... # apply transformations to value if given in attributes @@ -667,11 +672,6 @@ def read_2d_data(self, varname, xdim="longitude", ydim="latitude", **extradims): row.append(value) rows.append(row) - - # OPTIMIZATION: alternatively find the byte interval between every value to be read, - # and instead batch read all values at once using a slice with a step value, - # potentially implemented via a memoryview for optimal efficiency. - # ... return rows @@ -696,6 +696,7 @@ def calc_recsize(self): recvars = self.get_record_variables() recsize = sum((self.calc_vsize(varinfo["name"]) for varinfo in recvars)) recsize = self.round_nearest_4byte_boundary(recsize) + recsize += 4 # "it always includes padding to the next multiple of 4 bytes" return recsize def calc_vsize(self, varname): @@ -796,7 +797,7 @@ def get_coordinate_variables(self): print "----inspecting data:" pprint.pprint(varinfo) - rows = obj.read_2d_data(varname, time=10) # temperature kalvin + rows = obj.read_2d_data(varname, time=10) print repr(rows)[:900] print repr(rows[::50])[:900] print repr(rows)[-900:]