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