netcdf unlimited dimension in versions 3 & 4 with fortran90
Ken Knapp
Ken.Knapp at noaa.gov
Tue Jul 31 14:22:26 MDT 2007
Hi-
I'm kind of new to writing unlimited dimensions in netcdf and ran into
some odd behavior when attempting to write unlimited dimension with
netCDF4 and Fortran90. In short, I find two problems (for details of the
problems see below examples and code):
1) writing unlimited dimensions in netCDF4 significantly increases file
size over same data written with version 3.6. I realize I could turn on
deflate ... but why would netcdf4-unlimited be 10x bigger than the
ver.3.6 or ver.4??
2) writing large amounts of unlimited data seems impossible? Is there a
performance issue? I realize my code is likely not optimized. Maybe I'm
using the wrong netCDF flags? When attempting to write 1 million points
with an unlimited dimension, ver3 file (not shown) completes quickly,
ver.4 file never completed.
Thanks for any insight.
-Ken
p.s. I have Lahey-Fortran v6.20d and am using netcdf-4.0-snapshot2007052502
I've attached code used to produce 3 files: ver.3.6 unlimited-dimension,
ver.4 fixed-dimension data and ver.4 unlimited-dimension data
First, I run with NMAX=10,000
> haze:~/for/tests $ time ./test_unlimited ; lss Test_*
>
> real 0m3.040s
> user 0m2.640s
> sys 0m0.370s
> 48K Test_Limited_v4.nc 40K Test_Unlimited_v3.nc 420K
> Test_Unlimited_v4.nc
Since it is storing 10K int*4's, the file size should be ~40K. But the
ver.4 unlimited-dimension file is 10x too big?
OK, so I then ran it with NMAX=100,000
> haze:~/for/tests $ time ./test_unlimited ; lss Test_*
>
> real 0m30.478s
> user 0m27.220s
> sys 0m3.240s
> 404K Test_Limited_v4.nc 396K Test_Unlimited_v3.nc 4.0M
> Test_Unlimited_v4.nc
Same issue: ver.4 w/ unlimited is 10x too big? And now it completed in
10x3sec=30sec. not bad since number of writes is 10x before.
Now the kicker, NMAX=1,000,000 ... it never finishes on my system (after
20 minutes ... where it should conceivably finish after
3secx100=300sec=5 minutes). It completes the first 2 files, but it never
completes writing the Test_Unlimited_v4.nc file. Here's the output after
Cntrl-C'ing the job:
> haze:~/for/tests $ time ./test_unlimited ; lss Test_*
> real 20m22.557s
> user 4m19.840s
> sys 0m53.840s
> 3.9M Test_Limited_v4.nc 3.9M Test_Unlimited_v3.nc 40M
> Test_Unlimited_v4.nc
It never completed the write to Test_Unlimited_v4.nc, but the file sizes
are roughly the right size. In fact, the memory goes through the roof
and begins page swapping. Why?
> program unlimited
> use netcdf
> implicit none
> include 'netcdf4.inc'
> integer :: ncid, dim, vid, vid2, i
> integer :: nmax=1000000
>
> !NetCDF3 file
> call check( nf90_create('Test_Unlimited_v3.nc',NF90_CLOBBER,ncid) )
> call check( nf90_def_dim(ncid,"cell",NF90_UNLIMITED,dim) )
> call check( nf90_def_var(ncid,"temp",NF90_INT,dim,vid) )
> call check(nf90_enddef(ncid))
> do i=1,nmax
> call check( nf90_put_var(ncid,vid,i,start=(/ i /) ) )
> end do
> call check( nf90_close(ncid) )
>
> call check( nf90_create('Test_Limited_v4.nc',NF_NETCDF4,ncid) )
> call check( nf90_def_dim(ncid,"cell",nmax,dim) )
> call check( nf90_def_var(ncid,"temp",NF90_INT,dim,vid) )
> call check(nf90_enddef(ncid))
> do i=1,nmax
> call check( nf90_put_var(ncid,vid,i,start=(/i /) ) )
> end do
> call check( nf90_close(ncid) )
>
> call check( nf90_create('Test_Unlimited_v4.nc',NF_NETCDF4,ncid) )
> call check( nf90_def_dim(ncid,"cell",NF90_UNLIMITED,dim) )
> call check( nf90_def_var(ncid,"temp",NF90_INT,dim,vid) )
> call check(nf90_enddef(ncid))
> do i=1,nmax
> call check( nf90_put_var(ncid,vid,i,start=(/i /) ) )
> end do
> call check( nf90_close(ncid) )
>
> contains
> subroutine check(status)
> integer, intent ( in) :: status
> if(status /= nf90_noerr) then
> print *, trim(nf90_strerror(status))
> stop "Stopped"
> end if
> end subroutine check
> end program unlimited
--
Ken Knapp
Remote Sensing and Applications Division
National Climatic Data Center
151 Patton Ave
Asheville, NC 28801
828-271-4339 (voice) 828-271-4328 (fax)
==============================================================================
To unsubscribe netcdfgroup, visit:
http://www.unidata.ucar.edu/mailing-list-delete-form.html
==============================================================================
More information about the netcdfgroup
mailing list