From 6b41367ac688547671ab46e6bb1e0d325a285f4d Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Tue, 29 Apr 2008 13:02:05 -0500 Subject: [svn-r14892] RFC display compression ratio in h5dump Here's the current behavior of h5dump regarding the printing of the dataset creation property list For example ./h5dump -H -p -d filters HDF5 "tfilters.h5" { DATASET "deflate" { DATATYPE H5T_STD_I32LE DATASPACE SIMPLE { ( 20, 10 ) / ( 20, 10 ) } STORAGE_LAYOUT { CHUNKED ( 10, 5 ) SIZE 385 } FILTERS { COMPRESSION DEFLATE { LEVEL 9 } } FILLVALUE { FILL_TIME H5D_FILL_TIME_IFSET VALUE 0 } ALLOCATION_TIME { H5D_ALLOC_TIME_INCR } } } The proposed behavior is to add this information after SIZE SIZE 385 (51.9%COMPRESSION) That percentage is obtained trough Per = (b-a) / a Where a = theoretical size obtained by multiplying datum size times number of elements b = size obtained with H5Dget_storage_size The final print would look like HDF5 "tfilters.h5" { DATASET "deflate" { DATATYPE H5T_STD_I32LE DATASPACE SIMPLE { ( 20, 10 ) / ( 20, 10 ) } STORAGE_LAYOUT { CHUNKED ( 10, 5 ) SIZE 385 (51.9%COMPRESSION) } FILTERS { COMPRESSION DEFLATE { LEVEL 9 } } FILLVALUE { FILL_TIME H5D_FILL_TIME_IFSET VALUE 0 } ALLOCATION_TIME { H5D_ALLOC_TIME_INCR } } } tested: windows, linux, solaris --- tools/h5dump/h5dump.c | 83 +++++++++++++++++++++++++++++++++++++--- tools/testfiles/tallfilters.ddl | 2 +- tools/testfiles/tdeflate.ddl | 2 +- tools/testfiles/tnbit.ddl | 2 +- tools/testfiles/tscaleoffset.ddl | 2 +- tools/testfiles/tszip.ddl | 2 +- 6 files changed, 82 insertions(+), 11 deletions(-) diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 70d889f..dbac91d 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -2440,6 +2440,9 @@ static void dump_fill_value(hid_t dcpl,hid_t type_id, hid_t obj_id) * * Programmer: pvn * + * Modifications: pvn, March 28, 2008 + * Add a COMPRESSION ration information for cases when filters are present + * *------------------------------------------------------------------------- */ static void @@ -2455,7 +2458,7 @@ dump_dcpl(hid_t dcpl_id,hid_t type_id, hid_t obj_id) unsigned szip_pixels_per_block; hsize_t chsize[64]; /* chunk size in elements */ int rank; /* rank */ - char name[256]; /* external file name */ + char name[256]; /* external file name */ off_t offset; /* offset of external file */ hsize_t size; /* size of external file */ H5D_fill_value_t fvstatus; @@ -2467,11 +2470,12 @@ dump_dcpl(hid_t dcpl_id,hid_t type_id, hid_t obj_id) unsigned j; storage_size=H5Dget_storage_size(obj_id); + nfilters = H5Pget_nfilters(dcpl_id); ioffset=H5Dget_offset(obj_id); next=H5Pget_external_count(dcpl_id); strcpy(f_name,"\0"); - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * STORAGE_LAYOUT *------------------------------------------------------------------------- */ @@ -2490,7 +2494,72 @@ dump_dcpl(hid_t dcpl_id,hid_t type_id, hid_t obj_id) HDfprintf(stdout, ", %Hu", chsize[i]); printf(" %s\n", dump_header_format->dataspacedimend); indentation(indent + COL); - HDfprintf(stdout, "SIZE %Hu\n ", storage_size); + + + /* if there are filters, print a compression ratio */ + if ( nfilters ) + { + + hid_t sid = H5Dget_space( obj_id ); + hid_t tid = H5Dget_type( obj_id ); + size_t datum_size = H5Tget_size( tid ); + hsize_t dims[H5S_MAX_RANK]; + int ndims = H5Sget_simple_extent_dims( sid, dims, NULL); + hsize_t nelmts = 1; + hsize_t size; + double per = 0; + hssize_t a, b; + int ok = 0; + + /* only print the compression ratio for these filters */ + for ( i = 0; i < nfilters; i++) + { + cd_nelmts = NELMTS(cd_values); + filtn = H5Pget_filter2(dcpl_id, (unsigned)i, &filt_flags, &cd_nelmts, + cd_values, sizeof(f_name), f_name, NULL); + + switch (filtn) + { + case H5Z_FILTER_DEFLATE: + case H5Z_FILTER_SZIP: + case H5Z_FILTER_NBIT: + case H5Z_FILTER_SCALEOFFSET: + ok = 1; + break; + } + } + + if (ndims && ok ) + { + + for (i = 0; i < ndims; i++) + { + nelmts *= dims[i]; + } + size = nelmts * datum_size; + + a = size; b = storage_size; + if (a!=0) + per = (double) (b-a)/a; + + per = -per; + per *=100; + + HDfprintf(stdout, "SIZE %Hu (%.1f%%COMPRESSION)\n ", storage_size, per); + + } + else + HDfprintf(stdout, "SIZE %Hu\n ", storage_size); + + + H5Sclose(sid); + H5Tclose(tid); + + } + else + { + HDfprintf(stdout, "SIZE %Hu\n ", storage_size); + } /*end indent */ indent -= COL; @@ -2563,14 +2632,16 @@ dump_dcpl(hid_t dcpl_id,hid_t type_id, hid_t obj_id) * FILTERS *------------------------------------------------------------------------- */ - nfilters = H5Pget_nfilters(dcpl_id); + indentation(indent + COL); printf("%s %s\n", FILTERS, BEGIN); indent += COL; - if (nfilters) { - for (i=0; i