-
Notifications
You must be signed in to change notification settings - Fork 262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add optional support for zstandard compression #2173
Comments
Query: is zstandard the same as zlib-ng? |
@DennisHeimbigner Zstandard is distinct from zlib-ng, which is a drop-in replacement for zlib. The Zstandard API is different. You can see the Zstandard C API in action in this CCR codec code: https://github.com/ccr/ccr/blob/master/hdf5_plugins/ZSTANDARD/src/H5Zzstandard.c. |
Got it. What do you use as the zstandard implementation you use (i.e. code base)? |
@DennisHeimbigner the zstandard code can be found here: http://facebook.github.io/zstd/ However I installed it on ubuntu with:
|
@DennisHeimbigner as noted by Charlie, Zstandard is a completely different library from zlib. It has it's own filter number in the HDF5 ecosystem. zlib-ng is a great instant upgrade for everyone. It causes no compatibility issues and requires no code changes, it's fully backward compatible with old installs of netCDF, and it can be done today. But it only takes us a few steps back from the rising tide of data. Zstandard offers features beyond zlib/zlib-ng, including better performance and compression. Fully supporting it in netCDF will take some time and effort. Once available it will not be backward-compatible with old installations of netCDF - readers will have to upgrade to the latest netCDF release. So it will take time to become widely useful. But once implemented and digested by the community, Zstandard will allow our users to take a few more big steps back from that rising tide. ;-) |
I see there is also a numcodecs std for this, so adding some tests for it should |
To me the zstd algorithm definitely looks promising. If we were to do this, my only concerns would be:
|
I am happy to update the NUG, if necessary. The code for C/Fortran is already written, documented, and released in CCR. So it can be moved into the netcdf-c and netcdf-fortran libraries in a matter of hours, if the consensus is that zstandard should be fully supported in netCDF. I can do this at any time. The Java library is the open question. |
@DennisHeimbigner I don't understand your comments about codecs and testing. A few other stray points that have not yet been mentioned:
|
The codec stuff is necessary for nczarr filter support. |
To add zstandard support means:
This would make zstandard a privileged filter - one with greater support within the netCDF C, Fortran, and Java libraries. As noted, zstandard is already fully supported in CCR. The point of this issue is to move that support into the netCDF C and Fortran libraries, and to get a plan for adding it to netCDF-Java. |
The default compressor in
which worked even better than The conclusions of the blog post were:
Naturally there were benchmark result caveats also:
It would be great to have support for |
I was afraid of this. Everytime we get a new and "better" compressor, it becomes |
The reason to put zstandard into netCDF is that it makes it easy for users to converge on something better than zlib, without splintering the community into many different compressions, each unreadable by other users until they figure out how to locate, build, and install the correct filter. My understanding was that there was some concern at Unidata about this splintering of the community. The current state of play is that users can use CCR and have Zstandard and soon BLOSC. NetCDF-Java can catch up as best it can, or be left behind. This is the path we are now on. The goal with this issue is to guide the community into an acceptable, common choice. By providing full support for Zstandard, we make it the most attractive of the compression options. (BTW the LZ4 filter in HDF5 does not work, so that's why CCR does not support LZ4.) What I would like to tell the GFS team is that netCDF will soon support a better compression method, which will help meet their operational requirements. If not that, then NOAA can use CCR and Zstandard. However, Unidata can then expect to get many support requests from users trying to read NOAA data, and needing to have filters and CCR explained to them. ;-) And if ESA goes with BLOSC, NASA with LZ4, and NOAA with Zstandard, then there will be more work for the netCDF-Java team, or else they will simply have to give up on being able to read all netCDF files. If there is concern for splintering of the community, we should select a common, acceptable path forward. @DennisHeimbigner the amount of work to give zstandard preferential treatment is trivial. We spend a lot more time discussing it than it would take to do it... |
Is there a way to replace zstandard with zlib in a backwards compatible way? Perhaps the lib could detect the compression algorithm at runtime, and decompress accordingly. Zstandard could be made the default compression algorithm going forward? |
I would be hesitant to replace zlib altogether unless Zstandard were as ubiquitous across platforms and installations. Making it the default, when available, would be in line with the recent changes to our XML handling (if libxml is available, use that, if not, fall back to the bundled XML parser). |
No there is no way to replace zlib with zstandard. That would do a lot of violence to the way filters are handled in netCDF. Zlib is there and will always remain. Zstandard would add a new alternative. No form of compression is on by default - the user must always select a compression, if it is desired. |
As an aside. If memory serves, libblosc contains LZ4 impl. why not use that since you are already |
We've been working on a better "plug and play" way of handling filters/compressors in the netCDF-Java library. Right now, if there's already a Java implementation of zstd, it would be trivial to add it to the package. The current state is that zlib, shuffle, scaleoffset, and several 32-bit checksums are implemented in the core package, and users can supply others as plugins. But I'm also interested in working on a way to lean on CCR, in large part so that the java library can more easily stay in step with the others. Whatever we do, the java interface to the C library will likely need some work. As a side note, there's definitely a lot of interest from the Zarr community on this topic :) |
Sorry, but I just don't buy this "compressor du jour" approach to things. |
In thinking about this, it looks like we need to provide guidelines about |
Ed and I are jointly developing and maintaining the CCR. Except that he's a wizard and I'm a muggle at all the infrastructural and autotools stuff, which therefore falls to him. |
@DennisHeimbigner I find your comment about compression du jour to be a bit odd. We have been using zlib (and szip) for 15 years. Seems like an update of compression methods once every 15 years is not too frequent. When I meet netCDF users at meetings or conferences, I always ask what netCDF could be doing better to meet their science needs. The answer, invariably for the last five years (and longer), has been: "improve compression." As a member of the NOAA GFS team, I now also see this need from within NOAA. There seems to be a lack of appreciation at Unidata for the difficult decisions that large data producers must make. We want them to use netCDF for better interoperability and transparency, and they want that too, but they cannot sacrifice their operational requirements. If netCDF does not provide better compression, then data producers will start to find other solutions. Even now, unwelcome compromises about what can be written must be made. With higher resolutions here at NOAA, we will once again be over our I/O time budget in the GFS. What will happen then? The current course we are on is that users like NOAA will add CCR to get better compression methods. This will lead to fragmentation and extra work for the netCDF-Java team, as they attempt to cope with multiple compression filters. Widows users may find data inaccessible, if it has been compressed with software not ported to Windows. Thus my suggestion that one new, good compression method be added to netCDF, to try and head off this fragmentation. |
As I mentioned, the reason for zlib and szip support was because they were directly supported |
Your point abut blosc is a good one, but then it makes the netCDF Java team's work harder - they will have to cope with multiple decompression filters instead of one... |
We met on this yesterday and I'm drafting a big old chunk of text, but the TLDR version is we are interested in incorporating this, but we have a couple of questions. Looking forward to seeing this inclusion. I didn't want to head off into the weekend on a note of radio silence, so I just thought I'd mention that. Stand by for the larger post. |
OK, great. I will take a look at blosc and see if we can get it working in CCR so we can all take a look at it in action. I think this will take some time for us all to reach consensus, and for the work to be done. So I don't think this is going to happen before the next release or any time in the immediate future. ;-) Hopefully sometime in the first half of this year, if we can all agree we've found a good solution. Meanwhile, I'm very excited to see the new quantize feature released, in both C and Fortran. Used with the existing zlib compression, this will yield much better and somewhat faster compression for all uses. NOAA is waiting for this release, with the plan to then use the quantize feature in most (or all) of the models that run in the UFS, taking advantage of the smaller data sizes it will bring, which mean less time spent reading, writing, and transmitting data. So the quantize feature is eagerly awaited and will bring immediate benefit to large data producers. |
@WardF still waiting breathlessly for the larger post you promised.... |
@jswhit Thank you for the bump, it is appreciated :). This didn't fall off my radar, it just ended up sitting below the surface, covered by other things we're having to address at Unidata. Ok! As previously mentioned, we think we should move forward with this, and I'm excited to see what Reading back through the thread, we (the Unidata team) wanted to lay out the position we're in and highlight some of the considerations we are obliged to think about beyond the 'how easy will this be to add'. Not that that isn't also a consideration, and when there's an offer to add it via PR, all the better ;). In terms to adding bespoke functionality to the core netCDF-C library, we have to have a deliberate consideration of the following:
These questions are considered before we even get to the point of considering technical details (what does the API look like, are the packages available across platforms, are they available through package management systems or require installation from source, etc). As a result of these considerations, we often have to move more slowly than any of us would like when making these decisions; even when the answers seem clearcut, we have to consider the questions :). That said, the internal discussion more or less concluded that Zstd isn't going to dissapear, the risk of assuming an untenable technical debt is very low, the potential benefit to the broader community is high, and the workload of implementation across projects will not be crushing. Hooray, +1, lets discuss the details here. Thanks all for your patience! |
Ed, a question about this. This signature uses a zstandardp flag to indicate
Comment? |
I don't think it's a good idea to cause an inq function to error, if the
user has not done anything wrong. Currently, no inq function will give an
error as a way of communicating results, only for errors.
Also, many Fortran users do not check return codes. So it would be best if
this worked similarly to other inq functions.
…On Fri, Feb 11, 2022 at 3:09 PM Dennis Heimbigner ***@***.***> wrote:
int nc_inq_var_zstandard(int ncid, int varid, int *zstandardp, int
*levelp);
Ed, a question about this. This signature uses a zstandardp flag to
indicate
if the variable uses zstandard compression.
I would prefer an alternative of returnin NC_ENOFILTER if zstandard is not
used. This
reduces the the function to this form:
int nc_inq_var_zstandard(int ncid, int varid, int *levelp);
Comment?
—
Reply to this email directly, view it on GitHub
<#2173 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ABCSXXG2OIZWIRAQWFZ6SOTU2WCJXANCNFSM5LCTA5NA>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
OK, this has been done, although see #2294 for trouble in paradise. I will close this issue however. |
Release Notes {#RELEASE_NOTES} ============= \brief Release notes file for the netcdf-c package. This file contains a high-level description of this package's evolution. Releases are in reverse chronological order (most recent first). Note that, as of netcdf 4.2, the `netcdf-c++` and `netcdf-fortran` libraries have been separated into their own libraries. ## 4.9.3 - TBD ## 4.9.2 - March 14, 2023 This is the maintenance release which adds support for HDF5 version 1.14.0, in addition to a handful of other changes and bugfixes. * Fix 'make distcheck' error in run_interop.sh. See [Github #????](https://github.com/Unidata/netcdf-c/pull/????). * Update `nc-config` to remove inclusion from automatically-detected `nf-config` and `ncxx-config` files, as the wrong files could be included in the output. This is in support of [GitHub #2274](Unidata/netcdf-c#2274). * Update H5FDhttp.[ch] to work with HDF5 version 1.13.2 and later. See [Github #2635](Unidata/netcdf-c#2635). * [Bug Fix] Update DAP code to enable CURLOPT_ACCEPT_ENCODING by default. See [Github #2630](Unidata/netcdf-c#2630). * [Bug Fix] Fix byterange failures for certain URLs. See [Github #2649](Unidata/netcdf-c#2649). * [Bug Fix] Fix 'make distcheck' error in run_interop.sh. See [Github #2631](Unidata/netcdf-c#2631). * [Enhancement] Update `nc-config` to remove inclusion from automatically-detected `nf-config` and `ncxx-config` files, as the wrong files could be included in the output. This is in support of [GitHub #2274](Unidata/netcdf-c#2274). * [Enhancement] Update H5FDhttp.[ch] to work with HDF5 version 1.14.0. See [Github #2615](Unidata/netcdf-c#2615). ## 4.9.1 - February 2, 2023 ## Known Issues * A test in the `main` branch of `netcdf-cxx4` is broken by this rc; this will bear further investigation, but not being treated as a roadblock for the release candidate. * The new document, `netcdf-c/docs/filter_quickstart.md` is in rough-draft form. * Race conditions exist in some of the tests when run concurrently with large numbers of processors ## What's Changed from v4.9.0 (automatically generated) * Fix nc_def_var_fletcher32 operation by \@DennisHeimbigner in Unidata/netcdf-c#2403 * Merge relevant info updates back into `main` by \@WardF in Unidata/netcdf-c#2387 * Add manual GitHub actions triggers for the tests. by \@WardF in Unidata/netcdf-c#2404 * Use env variable USERPROFILE instead of HOME for windows and mingw. by \@DennisHeimbigner in Unidata/netcdf-c#2405 * Make public a limited API for programmatic access to internal .rc tables by \@DennisHeimbigner in Unidata/netcdf-c#2408 * Fix typo in CMakeLists.txt by \@georgthegreat in Unidata/netcdf-c#2412 * Fix choice of HOME dir by \@DennisHeimbigner in Unidata/netcdf-c#2416 * Check for libxml2 development files by \@WardF in Unidata/netcdf-c#2417 * Updating Doxyfile.in with doxygen-1.8.17, turned on WARN_AS_ERROR, added doxygen build to CI run by \@edwardhartnett in Unidata/netcdf-c#2377 * updated release notes by \@edwardhartnett in Unidata/netcdf-c#2392 * increase read block size from 1 KB to 4 MB by \@wkliao in Unidata/netcdf-c#2319 * fixed RELEASE_NOTES.md by \@edwardhartnett in Unidata/netcdf-c#2423 * Fix pnetcdf tests in cmake by \@WardF in Unidata/netcdf-c#2437 * Updated CMakeLists to avoid corner case cmake error by \@WardF in Unidata/netcdf-c#2438 * Add `--disable-quantize` to configure by \@WardF in Unidata/netcdf-c#2439 * Fix the way CMake handles -DPLUGIN_INSTALL_DIR by \@DennisHeimbigner in Unidata/netcdf-c#2430 * fix and test quantize mode for NC_CLASSIC_MODEL by \@edwardhartnett in Unidata/netcdf-c#2445 * Guard _declspec(dllexport) in support of #2446 by \@WardF in Unidata/netcdf-c#2460 * Ensure that netcdf_json.h does not interfere with ncjson. by \@DennisHeimbigner in Unidata/netcdf-c#2448 * Prevent cmake writing to source dir by \@magnusuMET in Unidata/netcdf-c#2463 * more quantize testing and adding pre-processor constant NC_MAX_FILENAME to nc_tests.h by \@edwardhartnett in Unidata/netcdf-c#2457 * Provide a default enum const when fill value does not match any enum constant by \@DennisHeimbigner in Unidata/netcdf-c#2462 * Fix support for reading arrays of HDF5 fixed size strings by \@DennisHeimbigner in Unidata/netcdf-c#2466 * fix musl build by \@magnusuMET in Unidata/netcdf-c#1701 * Fix AWS SDK linking errors by \@dzenanz in Unidata/netcdf-c#2470 * Address jump-misses-init issue. by \@WardF in Unidata/netcdf-c#2488 * Remove stray merge conflict markers by \@WardF in Unidata/netcdf-c#2493 * Add support for Zarr string type to NCZarr by \@DennisHeimbigner in Unidata/netcdf-c#2492 * Fix some problems with PR 2492 by \@DennisHeimbigner in Unidata/netcdf-c#2497 * Fix some bugs in the blosc filter wrapper by \@DennisHeimbigner in Unidata/netcdf-c#2461 * Add option to control accessing external servers by \@DennisHeimbigner in Unidata/netcdf-c#2491 * Changed attribute case in documentation by \@WardF in Unidata/netcdf-c#2482 * Adding all-error-codes.md back in to distribution documentation. by \@WardF in Unidata/netcdf-c#2501 * Update hdf5 version in github actions. by \@WardF in Unidata/netcdf-c#2504 * Minor update to doxygen function documentation by \@gsjaardema in Unidata/netcdf-c#2451 * Fix some addtional errors in NCZarr by \@DennisHeimbigner in Unidata/netcdf-c#2503 * Cleanup szip handling some more by \@DennisHeimbigner in Unidata/netcdf-c#2421 * Check for zstd development headers in autotools by \@WardF in Unidata/netcdf-c#2507 * Add new options to nc-config by \@WardF in Unidata/netcdf-c#2509 * Cleanup built test sources in nczarr_test by \@DennisHeimbigner in Unidata/netcdf-c#2508 * Fix inconsistency in netcdf_meta.h by \@WardF in Unidata/netcdf-c#2512 * Small fix in nc-config.in by \@WardF in Unidata/netcdf-c#2513 * For loop initial declarations are only allowed in C99 mode by \@gsjaardema in Unidata/netcdf-c#2517 * Fix some dependencies in tst_nccopy3 by \@WardF in Unidata/netcdf-c#2518 * Update plugins/Makefile.am by \@WardF in Unidata/netcdf-c#2519 * Fix prereqs in ncdump/tst_nccopy4 in order to avoid race conditions. by \@WardF in Unidata/netcdf-c#2520 * Move construction of VERSION file to end of the build by \@DennisHeimbigner in Unidata/netcdf-c#2527 * Add draft filter quickstart guide by \@WardF in Unidata/netcdf-c#2531 * Turn off extraneous debug output by \@DennisHeimbigner in Unidata/netcdf-c#2537 * typo fix by \@wkliao in Unidata/netcdf-c#2538 * replace 4194304 with READ_BLOCK_SIZE by \@wkliao in Unidata/netcdf-c#2539 * Rename variable to avoid function name conflict by \@ibaned in Unidata/netcdf-c#2550 * Add Cygwin CI and stop installing unwanted plugins by \@DWesl in Unidata/netcdf-c#2529 * Merge subset of v4.9.1 files back into main development branch by \@WardF in Unidata/netcdf-c#2530 * Add a Filter quickstart guide document by \@WardF in Unidata/netcdf-c#2524 * Fix race condition in ncdump (and other) tests. by \@DennisHeimbigner in Unidata/netcdf-c#2552 * Make dap4 reference dap instead of hard-wired to be disabled. by \@WardF in Unidata/netcdf-c#2553 * Suppress nczarr_test/tst_unknown filter test by \@DennisHeimbigner in Unidata/netcdf-c#2557 * Add fenceposting for HAVE_DECL_ISINF and HAVE_DECL_ISNAN by \@WardF in Unidata/netcdf-c#2559 * Add an old static file. by \@WardF in Unidata/netcdf-c#2575 * Fix infinite loop in file inferencing by \@DennisHeimbigner in Unidata/netcdf-c#2574 * Merge Wellspring back into development branch by \@WardF in Unidata/netcdf-c#2560 * Allow ncdump -t to handle variable length string attributes by \@srherbener in Unidata/netcdf-c#2584 * Fix an issue I introduced with make distcheck by \@WardF in Unidata/netcdf-c#2590 * make UDF0 not require NC_NETCDF4 by \@jedwards4b in Unidata/netcdf-c#2586 * Expose user-facing documentation related to byterange DAP functionality. by \@WardF in Unidata/netcdf-c#2596 * Fix Memory Leak by \@DennisHeimbigner in Unidata/netcdf-c#2598 * CI: Change autotools CI build to out-of-tree build. by \@DWesl in Unidata/netcdf-c#2577 * Update github action configuration scripts. by \@WardF in Unidata/netcdf-c#2600 * Update the filter quickstart guide. by \@WardF in Unidata/netcdf-c#2602 * Fix symbol export on Windows by \@WardF in Unidata/netcdf-c#2604 ## New Contributors * \@georgthegreat made their first contribution in Unidata/netcdf-c#2412 * \@dzenanz made their first contribution in Unidata/netcdf-c#2470 * \@DWesl made their first contribution in Unidata/netcdf-c#2529 * \@srherbener made their first contribution in Unidata/netcdf-c#2584 * \@jedwards4b made their first contribution in Unidata/netcdf-c#2586 **Full Changelog**: Unidata/netcdf-c@v4.9.0...v4.9.1 ### 4.9.1 - Release Candidate 2 - November 21, 2022 #### Known Issues * A test in the `main` branch of `netcdf-cxx4` is broken by this rc; this will bear further investigation, but not being treated as a roadblock for the release candidate. * The new document, `netcdf-c/docs/filter_quickstart.md` is in rough-draft form. #### Changes * [Bug Fix] Fix a race condition when testing missing filters. See [Github #2557](Unidata/netcdf-c#2557). * [Bug Fix] Fix some race conditions due to use of a common file in multiple shell scripts . See [Github #2552](Unidata/netcdf-c#2552). ### 4.9.1 - Release Candidate 1 - October 24, 2022 * [Enhancement][Documentation] Add Plugins Quick Start Guide. See [GitHub #2524](Unidata/netcdf-c#2524) for more information. * [Enhancement] Add new entries in `netcdf_meta.h`, `NC_HAS_BLOSC` and `NC_HAS_BZ2`. See [Github #2511](Unidata/netcdf-c#2511) and [Github #2512](Unidata/netcdf-c#2512) for more information. * [Enhancement] Add new options to `nc-config`: `--has-multifilters`, `--has-stdfilters`, `--has-quantize`, `--plugindir`. See [Github #2509](Unidata/netcdf-c#2509) for more information. * [Bug Fix] Fix some errors detected in PR 2497. [PR #2497](Unidata/netcdf-c#2497) . See [Github #2503](Unidata/netcdf-c#2503). * [Bug Fix] Split the remote tests into two parts: one for the remotetest server and one for all other external servers. Also add a configure option to enable the latter set. See [Github #2491](Unidata/netcdf-c#2491). * [Bug Fix] Fix blosc plugin errors. See [Github #2461](Unidata/netcdf-c#2461). * [Bug Fix] Fix support for reading arrays of HDF5 fixed size strings. See [Github #2466](Unidata/netcdf-c#2466). * [Bug Fix] Fix some errors detected in [PR #2492](Unidata/netcdf-c#2492) . See [Github #2497](Unidata/netcdf-c#2497). * [Enhancement] Add support for Zarr (fixed length) string type in nczarr. See [Github #2492](Unidata/netcdf-c#2492). * [Bug Fix] Split the remote tests into two parts: one for the remotetest server and one for all other external servers. Also add a configure option to enable the latter set. See [Github #2491](Unidata/netcdf-c#2491). * [Bug Fix] Fix support for reading arrays of HDF5 fixed size strings. See [Github #2462](Unidata/netcdf-c#2466). * [Bug Fix] Provide a default enum const when fill value does not match any enum constant for the value zero. See [Github #2462](Unidata/netcdf-c#2462). * [Bug Fix] Fix the json submodule symbol conflicts between libnetcdf and the plugin specific netcdf_json.h. See [Github #2448](Unidata/netcdf-c#2448). * [Bug Fix] Fix quantize with CLASSIC_MODEL files. See [Github #2405](Unidata/netcdf-c#2445). * [Enhancement] Add `--disable-quantize` option to `configure`. * [Bug Fix] Fix CMakeLists.txt to handle all acceptable boolean values for -DPLUGIN_INSTALL_DIR. See [Github #2430](Unidata/netcdf-c#2430). * [Bug Fix] Fix tst_vars3.c to use the proper szip flag. See [Github #2421](Unidata/netcdf-c#2421). * [Enhancement] Provide a simple API to allow user access to the internal .rc file table: supports get/set/overwrite of entries of the form "key=value". See [Github #2408](Unidata/netcdf-c#2408). * [Bug Fix] Use env variable USERPROFILE instead of HOME for windows and mingw. See [Github #2405](Unidata/netcdf-c#2405). * [Bug Fix] Fix the nc_def_var_fletcher32 code in hdf5 to properly test value of the fletcher32 argument. See [Github #2403](Unidata/netcdf-c#2403). ## 4.9.0 - June 10, 2022 * [Enhancement] Add quantize functions nc_def_var_quantize() and nc_inq_var_quantize() to enable lossy compression. See [Github #1548](Unidata/netcdf-c#1548). * [Enhancement] Add zstandard compression functions nc_def_var_zstandard() and nc_inq_var_zstandard(). See [Github #2173](Unidata/netcdf-c#2173). * [Enhancement] Have netCDF-4 logging output one file per processor when used with parallel I/O. See [Github #1762](Unidata/netcdf-c#1762). * [Enhancement] Improve filter installation process to avoid use of an extra shell script. See [Github #2348](Unidata/netcdf-c#2348). * [Bug Fix] Get "make distcheck" to work See [Github #2343](Unidata/netcdf-c#2343). * [Enhancement] Allow the read/write of JSON-valued Zarr attributes to allow for domain specific info such as used by GDAL/Zarr. See [Github #2278](Unidata/netcdf-c#2278). * [Enhancement] Turn on the XArray convention for NCZarr files by default. WARNING, this means that the mode should explicitly specify "nczarr" or "zarr" even if "xarray" or "noxarray" is specified. See [Github #2257](Unidata/netcdf-c#2257). * [Enhancement] Update the documentation to match the current filter capabilities See [Github #2249](Unidata/netcdf-c#2249). * [Enhancement] Update the documentation to match the current filter capabilities. See [Github #2249](Unidata/netcdf-c#2249). * [Enhancement] Support installation of pre-built standard filters into user-specified location. See [Github #2318](Unidata/netcdf-c#2318). * [Enhancement] Improve filter support. More specifically (1) add nc_inq_filter_avail to check if a filter is available, (2) add the notion of standard filters, (3) cleanup szip support to fix interaction with NCZarr. See [Github #2245](Unidata/netcdf-c#2245). * [Enhancement] Switch to tinyxml2 as the default xml parser implementation. See [Github #2170](Unidata/netcdf-c#2170). * [Bug Fix] Require that the type of the variable in nc_def_var_filter is not variable length. See [Github #/2231](Unidata/netcdf-c#2231). * [File Change] Apply HDF5 v1.8 format compatibility when writing to previous files, as well as when creating new files. The superblock version remains at 2 for newly created files. Full backward read/write compatibility for netCDF-4 is maintained in all cases. See [Github #2176](Unidata/netcdf-c#2176). * [Enhancement] Add ability to set dataset alignment for netcdf-4/HDF5 files. See [Github #2206](Unidata/netcdf-c#2206). * [Bug Fix] Improve UTF8 support on windows so that it can use utf8 natively. See [Github #2222](Unidata/netcdf-c#2222). * [Enhancement] Add complete bitgroom support to NCZarr. See [Github #2197](Unidata/netcdf-c#2197). * [Bug Fix] Clean up the handling of deeply nested VLEN types. Marks nc_free_vlen() and nc_free_string as deprecated in favor of ncaux_reclaim_data(). See [Github #2179](Unidata/netcdf-c#2179). * [Bug Fix] Make sure that netcdf.h accurately defines the flags in the open/create mode flags. See [Github #2183](Unidata/netcdf-c#2183). * [Enhancement] Improve support for msys2+mingw platform. See [Github #2171](Unidata/netcdf-c#2171). * [Bug Fix] Clean up the various inter-test dependencies in ncdump for CMake. See [Github #2168](Unidata/netcdf-c#2168). * [Bug Fix] Fix use of non-aws appliances. See [Github #2152](Unidata/netcdf-c#2152). * [Enhancement] Added options to suppress the new behavior from [Github #2135](Unidata/netcdf-c#2135). The options for `cmake` and `configure` are, respectively `-DENABLE_LIBXML2` and `--(enable/disable)-libxml2`. Both of these options defaul to 'on/enabled'. When disabled, the bundled `ezxml` XML interpreter is used regardless of whether `libxml2` is present on the system. * [Enhancement] Support optional use of libxml2, otherwise default to ezxml. See [Github #2135](Unidata/netcdf-c#2135) -- H/T to [Egbert Eich](https://github.com/e4t). * [Bug Fix] Fix several os related errors. See [Github #2138](Unidata/netcdf-c#2138). * [Enhancement] Support byte-range reading of netcdf-3 files stored in private buckets in S3. See [Github #2134](Unidata/netcdf-c#2134) * [Enhancement] Support Amazon S3 access for NCZarr. Also support use of the existing Amazon SDK credentials system. See [Github #2114](Unidata/netcdf-c#2114) * [Bug Fix] Fix string allocation error in H5FDhttp.c. See [Github #2127](Unidata/netcdf-c#2127). * [Bug Fix] Apply patches for ezxml and for selected oss-fuzz detected errors. See [Github #2125](Unidata/netcdf-c#2125). * [Bug Fix] Ensure that internal Fortran APIs are always defined. See [Github #2098](Unidata/netcdf-c#2098). * [Enhancement] Support filters for NCZarr. See [Github #2101](Unidata/netcdf-c#2101) * [Bug Fix] Make PR 2075 long file name be idempotent. See [Github #2094](Unidata/netcdf-c#2094). ## 4.8.1 - August 18, 2021 * [Bug Fix] Fix multiple bugs in libnczarr. See [Github #2066](Unidata/netcdf-c#2066). * [Enhancement] Support windows network paths (e.g. \\svc\...). See [Github #2065](Unidata/netcdf-c#2065). * [Enhancement] Convert to a new representation of the NCZarr meta-data extensions: version 2. Read-only backward compatibility is provided. See [Github #2032](Unidata/netcdf-c#2032). * [Bug Fix] Fix dimension_separator bug in libnczarr. See [Github #2035](Unidata/netcdf-c#2035). * [Bug Fix] Fix bugs in libdap4. See [Github #2005](Unidata/netcdf-c#2005). * [Bug Fix] Store NCZarr fillvalue as a singleton instead of a 1-element array. See [Github #2017](Unidata/netcdf-c#2017). * [Bug Fixes] The netcdf-c library was incorrectly determining the scope of dimension; similar to the type scope problem. See [Github #2012](Unidata/netcdf-c#2012) for more information. * [Bug Fix] Re-enable DAP2 authorization testing. See [Github #2011](Unidata/netcdf-c#2011). * [Bug Fix] Fix bug with windows version of mkstemp that causes failure to create more than 26 temp files. See [Github #1998](Unidata/netcdf-c#1998). * [Bug Fix] Fix ncdump bug when printing VLENs with basetype char. See [Github #1986](Unidata/netcdf-c#1986). * [Bug Fixes] The netcdf-c library was incorrectly determining the scope of types referred to by nc_inq_type_equal. See [Github #1959](Unidata/netcdf-c#1959) for more information. * [Bug Fix] Fix bug in use of XGetopt when building under Mingw. See [Github #2009](Unidata/netcdf-c#2009). * [Enhancement] Improve the error reporting when attempting to use a filter for which no implementation can be found in HDF5_PLUGIN_PATH. See [Github #2000](Unidata/netcdf-c#2000) for more information. * [Bug Fix] Fix `make distcheck` issue in `nczarr_test/` directory. See [Github #2007](Unidata/netcdf-c#2007). * [Bug Fix] Fix bug in NCclosedir in dpathmgr.c. See [Github #2003](Unidata/netcdf-c#2003). * [Bug Fix] Fix bug in ncdump that assumes that there is a relationship between the total number of dimensions and the max dimension id. See [Github #2004](Unidata/netcdf-c#2004). * [Bug Fix] Fix bug in JSON processing of strings with embedded quotes. See [Github #1993](Unidata/netcdf-c#1993). * [Enhancement] Add support for the new "dimension_separator" enhancement to Zarr v2. See [Github #1990](Unidata/netcdf-c#1990) for more information. * [Bug Fix] Fix hack for handling failure of shell programs to properly handle escape characters. See [Github #1989](Unidata/netcdf-c#1989). * [Bug Fix] Allow some primitive type names to be used as identifiers depending on the file format. See [Github #1984](Unidata/netcdf-c#1984). * [Enhancement] Add support for reading/writing pure Zarr storage format that supports the XArray _ARRAY_DIMENSIONS attribute. See [Github #1952](Unidata/netcdf-c#1952) for more information. * [Update] Updated version of bzip2 used in filter testing/functionality, in support of [Github #1969](Unidata/netcdf-c#1969). * [Bug Fix] Corrected HDF5 version detection logic as described in [Github #1962](Unidata/netcdf-c#1962). ## 4.8.0 - March 30, 2021 * [Enhancement] Bump the NC_DISPATCH_VERSION from 2 to 3, and as a side effect, unify the definition of NC_DISPATCH_VERSION so it only needs to be defined in CMakeLists.txt and configure.ac. See [Github #1945](Unidata/netcdf-c#1945) for more information. * [Enhancement] Provide better cross platform path name management. This converts paths for various platforms (e.g. Windows, MSYS, etc.) so that they are in the proper format for the executing platform. See [Github #1958](Unidata/netcdf-c#1958) for more information. * [Bug Fixes] The nccopy program was treating -d0 as turning deflation on rather than interpreting it as "turn off deflation". See [Github #1944](Unidata/netcdf-c#1944) for more information. * [Enhancement] Add support for storing NCZarr data in zip files. See [Github #1942](Unidata/netcdf-c#1942) for more information. * [Bug Fixes] Make fillmismatch the default for DAP2 and DAP4; too many servers ignore this requirement. * [Bug Fixes] Fix some memory leaks in NCZarr, fix a bug with long strides in NCZarr. See [Github #1913](Unidata/netcdf-c#1913) for more information. * [Enhancement] Add some optimizations to NCZarr, dosome cleanup of code cruft, add some NCZarr test cases, add a performance test to NCZarr. See [Github #1908](Unidata/netcdf-c#1908) for more information. * [Bug Fix] Implement a better chunk cache system for NCZarr. The cache now uses extendible hashing plus a linked list for provide a combination of expandibility, fast access, and LRU behavior. See [Github #1887](Unidata/netcdf-c#1887) for more information. * [Enhancement] Provide .rc fields for S3 authentication: HTTP.S3.ACCESSID and HTTP.S3.SECRETKEY. * [Enhancement] Give the client control over what parts of a DAP2 URL are URL encoded (i.e. %xx). This is to support the different decoding rules that servers apply to incoming URLS. See [Github #1884](Unidata/netcdf-c#1884) for more information. * [Bug Fix] Fix incorrect time offsets from `ncdump -t`, in some cases when the time `units` attribute contains both a **non-zero** time-of-day, and a time zone suffix containing the letter "T", such as "UTC". See [Github #1866](Unidata/netcdf-c#1866) for more information. * [Bug Fix] Cleanup the NCZarr S3 build options. See [Github #1869](Unidata/netcdf-c#1869) for more information. * [Bug Fix] Support aligned access for selected ARM processors. See [Github #1871](Unidata/netcdf-c#1871) for more information. * [Documentation] Migrated the documents in the NUG/ directory to the dedicated NUG repository found at https://github.com/Unidata/netcdf * [Bug Fix] Revert the internal filter code to simplify it. From the user's point of view, the only visible change should be that (1) the functions that convert text to filter specs have had their signature reverted and renamed and have been moved to netcdf_aux.h, and (2) Some filter API functions now return NC_ENOFILTER when inquiry is made about some filter. Internally, the dispatch table has been modified to get rid of the complex structures. * [Bug Fix] If the HDF5 byte-range Virtual File Driver is available )HDf5 1.10.6 or later) then use it because it has better performance than the one currently built into the netcdf library. * [Bug Fix] Fixed byte-range support with cURL > 7.69. See [Unidata/netcdf-c#1798]. * [Enhancement] Added new test for using compression with parallel I/O: nc_test4/tst_h_par_compress.c. See [Unidata/netcdf-c#1784]. * [Bug Fix] Don't return error for extra calls to nc_redef() for netCDF/HDF5 files, unless classic model is in use. See [Unidata/netcdf-c#1779]. * [Enhancement] Added new parallel I/O benchmark program to mimic NOAA UFS data writes, built when --enable-benchmarks is in configure. See [Unidata/netcdf-c#1777]. * [Bug Fix] Now allow szip to be used on variables with unlimited dimension [Unidata/netcdf-c#1774]. * [Enhancement] Add support for cloud storage using a variant of the Zarr storage format. Warning: this feature is highly experimental and is subject to rapid evolution [https://www.unidata.ucar.edu/blogs/developer/en/entry/overview-of-zarr-support-in]. * [Bug Fix] Fix nccopy to properly set default chunking parameters when not otherwise specified. This can significantly improve performance in selected cases. Note that if seeing slow performance with nccopy, then, as a work-around, specifically set the chunking parameters. [Unidata/netcdf-c#1763]. * [Bug Fix] Fix some protocol bugs/differences between the netcdf-c library and the OPeNDAP Hyrax server. Also cleanup checksum handling [https://github.com/Unidata/netcdf-c/issues/1712].* [Bug Fix] IMPORTANT: Ncgen was not properly handling large data sections. The problem manifests as incorrect ordering of data in the created file. Aside from examining the file with ncdump, the error can be detected by running ncgen with the -lc flag (to produce a C file). Examine the file to see if any variable is written in pieces as opposed to a single call to nc_put_vara. If multiple calls to nc_put_vara are used to write a variable, then it is probable that the data order is incorrect. Such multiple writes can occur for large variables and especially when one of the dimensions is unlimited. * [Bug Fix] Add necessary __declspec declarations to allow compilation of netcdf library without causing errors or (_declspec related) warnings [Unidata/netcdf-c#1725]. * [Enhancement] When a filter is applied twice with different parameters, then the second set is used for writing the dataset [Unidata/netcdf-c#1713]. * [Bug Fix] Now larger cache settings are used for sequential HDF5 file creates/opens on parallel I/O capable builds; see [Github #1716](Unidata/netcdf-c#1716) for more information. * [Bug Fix] Add functions to libdispatch/dnotnc4.c to support dispatch table operations that should work for any dispatch table, even if they do not do anything; functions such as nc_inq_var_filter [Unidata/netcdf-c#1693]. * [Bug Fix] Fixed a scalar annotation error when scalar == 0; see [Github #1707](Unidata/netcdf-c#1707) for more information. * [Bug Fix] Use proper CURLOPT values for VERIFYHOST and VERIFYPEER; the semantics for VERIFYHOST in particular changed. Documented in NUG/DAP2.md. See [Unidata/netcdf-c#1684]. * [Bug Fix][cmake] Correct an issue with parallel filter test logic in CMake-based builds. * [Bug Fix] Now allow nc_inq_var_deflate()/nc_inq_var_szip() to be called for all formats, not just HDF5. Non-HDF5 files return NC_NOERR and report no compression in use. This reverts behavior that was changed in the 4.7.4 release. See [Unidata/netcdf-c#1691]. * [Bug Fix] Compiling on a big-endian machine exposes some missing forward delcarations in dfilter.c. * [File Change] Change from HDF5 v1.6 format compatibility, back to v1.8 compatibility, for newly created files. The superblock changes from version 0 back to version 2. An exception is when using libhdf5 deprecated versions 1.10.0 and 1.10.1, which can only create v1.6 compatible format. Full backward read/write compatibility for netCDF-4 is maintained in all cases. See [Github #951](Unidata/netcdf-c#951). ## 4.7.4 - March 27, 2020 * [Windows] Bumped packaged HDF5 to 1.10.6, HDF4 to 4.2.14, and libcurl to 7.60.0. * [Enhancement] Support has been added for HDF5-1.12.0. See [Unidata/netcdf-c#1528]. * [Bug Fix] Correct behavior for the command line utilities when directly accessing a directory using utf8 characters. See [Github #1669] (Unidata/netcdf-c#1669), [Github #1668] (Unidata/netcdf-c#1668) and [Github #1666] (Unidata/netcdf-c#1666) for more information. * [Bug Fix] Attempts to set filters or chunked storage on scalar vars will now return NC_EINVAL. Scalar vars cannot be chunked, and only chunked vars can have filters. Previously the library ignored these attempts, and always storing scalars as contiguous storage. See [Unidata/netcdf-c#1644]. * [Enhancement] Support has been added for multiple filters per variable. See [Unidata/netcdf-c#1584]. * [Enhancement] Now nc_inq_var_szip retuns 0 for parameter values if szip is not in use for var. See [Unidata/netcdf-c#1618]. * [Enhancement] Now allow parallel I/O with filters, for HDF5-1.10.3 and later. See [Unidata/netcdf-c#1473]. * [Enhancement] Increased default size of cache buffer to 16 MB, from 4 MB. Increased number of slots to 4133. See [Unidata/netcdf-c#1541]. * [Enhancement] Allow zlib compression to be used with parallel I/O writes, if HDF5 version is 1.10.3 or greater. See [Unidata/netcdf-c#1580]. * [Enhancement] Restore use of szip compression when writing data (including writing in parallel if HDF5 version is 1.10.3 or greater). See [Unidata/netcdf-c#1546]. * [Enhancement] Enable use of compact storage option for small vars in netCDF/HDF5 files. See [Unidata/netcdf-c#1570]. * [Enhancement] Updated benchmarking program bm_file.c to better handle very large files. See [Unidata/netcdf-c#1555]. * [Enhancement] Added version number to dispatch table, and now check version with nc_def_user_format(). See [Unidata/netcdf-c#1599]. * [Bug Fix] Fixed user setting of MPI launcher for parallel I/O HDF5 test in h5_test. See [Unidata/netcdf-c#1626]. * [Bug Fix] Fixed problem of growing memory when netCDF-4 files were opened and closed. See [Unidata/netcdf-c#1575 and Unidata/netcdf-c#1571]. * [Enhancement] Increased size of maximum allowed name in HDF4 files to NC_MAX_NAME. See [Unidata/netcdf-c#1631]. ## 4.7.3 - November 20, 2019 * [Bug Fix]Fixed an issue where installs from tarballs will not properly compile in parallel environments. * [Bug Fix] Library was modified so that rewriting the same attribute happens without deleting the attribute, to avoid a limit on how many times this may be done in HDF5. This fix was thought to be in 4.6.2 but was not. See [Unidata/netcdf-c#350]. * [Enhancement] Add a dispatch version number to netcdf_meta.h and libnetcdf.settings, in case we decide to change dispatch table in future. See [Unidata/netcdf-c#1469]. * [Bug Fix] Now testing that endianness can only be set on atomic ints and floats. See [Unidata/netcdf-c#1479]. * [Bug Fix] Fix for subtle error involving var and unlimited dim of the same name, but unrelated, in netCDF-4. See [Unidata/netcdf-c#1496]. * [Enhancement] Update for attribute documentation. See [Unidata/netcdf-c#1512]. * [Bug Fix][Enhancement] Corrected assignment of anonymous (a.k.a. phony) dimensions in an HDF5 file. Now when a dataset uses multiple dimensions of the same size, netcdf assumes they are different dimensions. See [GitHub #1484](Unidata/netcdf-c#1484) for more information. ## 4.7.2 - October 22, 2019 * [Bug Fix][Enhancement] Various bug fixes and enhancements. * [Bug Fix][Enhancement] Corrected an issue where protected memory was being written to with some pointer slight-of-hand. This has been in the code for a while, but appears to be caught by the compiler on OSX, under circumstances yet to be completely nailed down. See [GitHub #1486] (Unidata/netcdf-c#1486) for more information. * [Enhancement] [Parallel IO] Added support for parallel functions in MSVC. See [Github #1492](Unidata/netcdf-c#1492) for more information. * [Enhancement] Added a function for changing the ncid of an open file. This function should only be used if you know what you are doing, and is meant to be used primarily with PIO integration. See [GitHub #1483] (Unidata/netcdf-c#1483) and [GitHub #1487] (Unidata/netcdf-c#1487) for more information. ## 4.7.1 - August 27, 2019 * [Enhancement] Added unit_test directory, which contains unit tests for the libdispatch and libsrc4 code (and any other directories that want to put unit tests there). Use --disable-unit-tests to run without unit tests (ex. for code coverage analysis). See [GitHub #1458] (Unidata/netcdf-c#1458). * [Bug Fix] Remove obsolete _CRAYMPP and LOCKNUMREC macros from code. Also brought documentation up to date in man page. These macros were used in ancient times, before modern parallel I/O systems were developed. Programmers interested in parallel I/O should see nc_open_par() and nc_create_par(). See [GitHub #1459](Unidata/netcdf-c#1459). * [Enhancement] Remove obsolete and deprecated functions nc_set_base_pe() and nc_inq_base_pe() from the dispatch table. (Both functions are still supported in the library, this is an internal change only.) See [GitHub #1468](Unidata/netcdf-c#1468). * [Bug Fix] Reverted nccopy behavior so that if no -c parameters are given, then any default chunking is left to the netcdf-c library to decide. See [GitHub #1436](Unidata/netcdf-c#1436). ## 4.7.0 - April 29, 2019 * [Enhancement] Updated behavior of `pkgconfig` and `nc-config` to allow the use of the `--static` flags, e.g. `nc-config --libs --static`, which will show information for linking against `libnetcdf` statically. See [Github #1360] (Unidata/netcdf-c#1360) and [Github #1257] (Unidata/netcdf-c#1257) for more information. * [Enhancement] Provide byte-range reading of remote datasets. This allows read-only access to, for example, Amazon S3 objects and also Thredds Server datasets via the HTTPService access method. See [GitHub #1251] (Unidata/netcdf-c#1251). * Update the license from the home-brewed NetCDF license to the standard 3-Clause BSD License. This change does not result in any new restrictions; it is merely the adoption of a standard, well-known and well-understood license in place of the historic NetCDF license written at Unidata. This is part of a broader push by Unidata to adopt modern, standardized licensing. ## 4.6.3 - February 28, 2019 * [Bug Fix] Correctly generated `netcdf.pc` generated either by `configure` or `cmake`. If linking against a static netcdf, you would need to pass the `--static` argument to `pkg-config` in order to list all of the downstream dependencies. See [Github #1324](Unidata/netcdf-c#1324) for more information. * Now always write hidden coordinates attribute, which allows faster file opens when present. See [Github #1262](Unidata/netcdf-c#1262) for more information. * Some fixes for rename, including fix for renumbering of varids after a rename (#1307), renaming var to dim without coordinate var. See [Github #1297] (Unidata/netcdf-c#1297). * Fix of NULL parameter causing segfaults in put_vars functions. See [Github #1265] (Unidata/netcdf-c#1265) for more information. * Fix of --enable-benchmark benchmark tests [Github #1211] (Unidata/netcdf-c#1211) * Update the license from the home-brewed NetCDF license to the standard 3-Clause BSD License. This change does not result in any new restrictions; it is merely the adoption of a standard, well-known and well-understood license in place of the historic NetCDF license written at Unidata. This is part of a broader push by Unidata to adopt modern, standardized licensing. * [BugFix] Corrected DAP-related issues on big-endian machines. See [Github #1321] (Unidata/netcdf-c#1321), [Github #1302] (Unidata/netcdf-c#1302) for more information. * [BugFix][Enhancement] Various and sundry bugfixes and performance enhancements, thanks to \@edhartnett, \@gsjarrdema, \@t-b, \@wkliao, and all of our other contributors. * [Enhancement] Extended `nccopy -F` syntax to support multiple variables with a single invocation. See [Github #1311](Unidata/netcdf-c#1311) for more information. * [BugFix] Corrected an issue where DAP2 was incorrectly converting signed bytes, resulting in an erroneous error message under some circumstances. See [GitHub #1317] (Unidata/netcdf-c#1317) for more information. See [Github #1319] (Unidata/netcdf-c#1319) for related information. * [BugFix][Enhancement] Modified `nccopy` so that `_NCProperties` is not copied over verbatim but is instead generated based on the version of `libnetcdf` used when copying the file. Additionally, `_NCProperties` are displayed if/when associated with a netcdf3 file, now. See [GitHub#803] (Unidata/netcdf-c#803) for more information.
I suggest we fully support the ZStandard library in the netCDF C, Fortran, and Java libraries. (This suggestion is part of a larger effort to improve netCDF compression #1545).
Compression is Essential, and Zlib is Slow
Compression has become a core component of netCDF. Large data producers, like NOAA, NASA, and ESA, all must compress their data in order to fit into their storage systems, which were sized with the assumption that data compression would be used operationally. That is, none of these data providers have the disk space to process and store these data uncompressed. Compression is essential.
The slowness of zlib with today's giant data files has become a real problem for ESA with the Copernicus satellite program, which has been generating large amounts of netCDF-4 data for many years. As with NASA Earth observing missions, the amazing increase in the capabilities of space instruments has been accompanied with a dramatic increase in the size of the data - the slow speed of zlib is becoming a serious problem.
As documented in #1545 NOAA is also running into the limits of zlib. For the recent GFS release, we dodged the bullet by adding the ability to use zlib with parallel I/O to netcdf-c-4.7.4. This allowed NOAA to regain its lost time budget and write the forecast data on time. But future versions of the GFS are planned with higher resolution. As we all understand, doubling the resolution in time and space results in a 16-fold multiplication of the data sizes, and, consequently, the time required to compress the data.
Why ZStandard?
The Zstandard compression library, currently available to netCDF users through the CCR project, provides significant performance improvements over zlib.
This chart from our recent AGU extended abstract shows typical performance improvement achieved with ZStandard:
When used with the new quantize feature, Zstandard performance is even more impressive:
Zstandard also offers a much wider range of tradeoff between compression and speed. For example in Klower's paper a setting of -10 was used to get very fast compression, which only compressed the data 50%. This allows operational requirements to be met. Zlib does not offer this range of speed/compression trade off. It is not possible to make zlib go much faster, whatever setting is used.
ZStandard is free and open software, readily available on all platforms: Unix, MacOS, and Windows. A reference C library is available which can be compiled anywhere, and pre-build Zstandard libraries are available on most package management systems. A pure-Java implementation is also available from the Zstandard website.
The Zstandard web site displays a table of Zstandard performance compared to other compression libraries, including zlib. They show better performance than I have measured but similar. They show a 5x speedup for writing, 4x for reading. (I have not measured read time - NOAA is more concerned with write times.)
Implementation
How would this look in implementation?
C and Fortran
The C and Fortran implementations are available in the CCR. They are very similar to the existing functions which currently support zlib:
In Fortran:
The build systems would be updated to optionally include Zstandard, as Szip is handled now. Extra items in the build summary and netcdf_meta.h will help end users know if Zstandard is supported in any particular build. The Zstandard filter code would be included with netcdf-c, and installed in the HDF5 filter directory for the user.
(If released in the netCDF C and Fortran libraries, these functions would be removed from CCR.)
NetCDF-Java
There is a pure-Java Zstandard library. Code to use it as a filter would have to be written by the Unidata netCDF-Java team.
My understanding is that only Java read code would have to be modified. The pure Java part of netCDF-Java only reads NetCDF/HDF5 files. In this case the use of Zstandard would be similar to the way zlib is handled.
The NetCDF-Java library would be able to use the C library to write netCDF/HDF5 files with Zstandard compression, but support would have to be added to call the new functions.
Conclusion
The inclusion of Zstandard in all netCDF libraries will be a significant improvement for large data producers such as NOAA, NASA, and ESA. Zstandard provides both better performance and a much better range of performance, allowing data producers to tune the compression vs. speed of their data to match sometimes stringent operational requirements.
All readers of compressed data will also benefit from a performance speedup with Zstandard.
The greater ease of handling larger and larger data sets will also bring benefit to the science community, as more data can be written and distributed within the operational constraints of large data producers.
Although these benefits are currently available if all concerned install CCR, I believe there will be significant benefit to the netCDF community if Zstandard were supported out of the box by all netCDF libraries.
@DennisHeimbigner @WardF @dopplershift @lesserwhirls @czender and @gsjaardema your input is very much requested...
References
CCR web site: https://github.com/ccr/ccr
Zstandard web site: http://facebook.github.io/zstd/
Compressing atmospheric data into its real information content
Milan Klöwer, Miha Razinger, Juan J. Dominguez, Peter D. Düben & Tim N. Palmer, https://www.nature.com/articles/s43588-021-00156-2
Quantization and Next-Generation Zlib Compression for Fully Backward-Compatible, Faster, and More Effective Data Compression in NetCDF Files, Hartnett, Zender, Fisher, Heimbigner, Hang, Gerheiser, Curtis: https://www.researchgate.net/publication/357001251_Quantization_and_Next-Generation_Zlib_Compression_for_Fully_Backward-Compatible_Faster_and_More_Effective_Data_Compression_in_NetCDF_Files
The text was updated successfully, but these errors were encountered: