diff options
author | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-04-29 19:15:53 (GMT) |
---|---|---|
committer | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-04-29 19:15:53 (GMT) |
commit | b2a2c17c44bdf53a27b0f868752c9d6f6148e1ad (patch) | |
tree | 7a1496e5a192e5563f48d9dfdf179854af3eeebc /tools/h5dump/h5dump.c | |
parent | c954ba63a4ccdd39353506e7f963cb3efce70461 (diff) | |
download | hdf5-b2a2c17c44bdf53a27b0f868752c9d6f6148e1ad.zip hdf5-b2a2c17c44bdf53a27b0f868752c9d6f6148e1ad.tar.gz hdf5-b2a2c17c44bdf53a27b0f868752c9d6f6148e1ad.tar.bz2 |
[svn-r14895] 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
Diffstat (limited to 'tools/h5dump/h5dump.c')
-rw-r--r-- | tools/h5dump/h5dump.c | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 70d889f..f951efc 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 ratio information for cases when filters are present + * *------------------------------------------------------------------------- */ static void @@ -2467,6 +2470,7 @@ 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"); @@ -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; @@ -2559,11 +2628,11 @@ dump_dcpl(hid_t dcpl_id,hid_t type_id, hid_t obj_id) printf("%s\n",END); } } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * FILTERS *------------------------------------------------------------------------- */ - nfilters = H5Pget_nfilters(dcpl_id); + indentation(indent + COL); printf("%s %s\n", FILTERS, BEGIN); |