I fear that a flush after each write can be quite expensive.
Furthermore, I do not know if HDF5 guarantees the file to be uncorrupted
if the failure occurs during the write of data (inbetween flushes). 

Another option is to write the data into an external raw data file and
make links to that file (or segments) in the HDF5 file. It is described
in section 5.5.4 of the HDF users's guide. In case of an unexpected
failure, it is always possible to make the links afterwards. 
We make use of it in our LOFAR data writer. 



>>> Ewan Makepeace <makepe...@jawasoft.com> 28-Sep-17 5:48 >>>
Thank-you to all of you who have replied to my query on this (appended
at bottom). 


To summarise replies (with my feedback inline) are: 





From: "Miller, Mark C." <mille...@llnl.gov>  





Well, I think it is best to close datasets, dataspaces, types, and
groups as soon as possible when you know you no longer need them. That
should help to minimize memory usage. Also, can you possibly add a call
to H5Fflush()
(https://support.hdfgroup.org/HDF5/doc/RM/RM_H5F.html#File-Flush) so
that it happens relatively regularly? Can you possibly do something like
on Linux where you *catch* a signal and then call H5Fclose() on the file
as part of the signal handler? Are you by chance calling H5dont_atexit()
(https://support.hdfgroup.org/HDF5/doc/RM/RM_H5.html#Library-DontAtExit)
somewhere to prevent HDF5's smarts to close down the file gracefully
upon exit? (fyi...these are all linux-isms and so I don't know if they
will be of much use to you in your context)
 


We have written a completely object oriented layer to manage the
references - all the objects get disposed correctly (and in the right
order) in normal operation. The problem (as others have pointed out) is
that the caching in HDF5 leaves the files in an unpredictable and often
invalid state when we terminate unexpectedly. 



We will try adding a call to H5Flush after every write which may solve
the issue although at what cost in performance I do not know. 





One of the DOE labs invested in a 'journaling metadata' enhancement to
HDF5. I think that work was nearly completed. However, it has since
staled on a private branch and has yet to have been merged into the
mainline of the code. It might be worth making a pitch for that if you
think it could be useful in this context. Again, I am not sure because
all my experience is linux-centric.  


This does sound like a problem that would be solved by file journaling
- but in the absence of a library not an option. 





"Jager, Gerco de" <g.d.ja...@marin.nl>  




I recently started writing a converter from our proprietary
measurements format to HDF5 in C# and using the HDF.PInvoke nuget
distribution. I've read that the HDF.PInvoke is the way forward and
hopefully it discloses all the features you need.  


I am aware that HDF5.net is deprecated and systems based on PInvoke are
recommended but we have had almost no issues with it so far - as I said
if the system does not stop while writing (due to exceptions in other
code unrelated to the persistence layer) the file is never corrupted. In
fact I suspect that the problem is in the caching of data and doubt
PInvoke will solve that problem. 





From: Quincey Koziol <koz...@lbl.gov>  




Hi Ewan,
There?s two things you can be doing to address file corruption issues:

- For the near term, use the techniques and code for managing the
metadata cache described here: 
https://support.hdfgroup.org/HDF5/docNewFeatures/FineTuneMDC/RFC%20H5Ocork%20v5%20new%20fxn%20names.pdf<https://support.hdfgroup.org/HDF5/docNewFeatures/FineTuneMDC/RFC%20H5Ocork%20v5%20new%20fxn%20names.pdf>
 

- In the next year or so, we will be finishing the ?SWMR? feature,
described here: 
https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html<https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html>

The metadata cache techniques are rather unsubtle, but will avoid
corrupted files until the ?full? SWMR feature is finished.  


This is fascinating stuff. The SWMR features have a lot of application
for us but seem to be taking longer than originally expected. The meta
data management tools are of interest - but I am not sure we need fine
grained control here - we basically need to have the file valid after
every write and so I think the first thing to try is just flush the
whole file every write. 



The other option I am considering is to remove our HDF5 code from the
assembly and run it as a standalone service so that in the event of a
crash in our application the HDF5 service is still running and hopefully
able to flush and close the file gracefully. 



rgds, 

Ewan 



Original Question: 





Dear Experts,

We are building a data acquisition and processing system on top of an
HDF5 file store. Generally we have been very pleased with HDF5 - great
flexibility in data structure, performant, small file size, availability
of third party data access tools etc.

However our system needs to run for 36-48 hours at a time - and we are
finding that if we (deliberately or accidentally) stop the process while
running (and writing data) the file is corrupted and we lose all our
work.

We are in C# and wrote our access routines on top of
HDF5.net<http://HDF5.net> (which I understand is deprecated). We tend to
keep all active pointer objects open for the duration of the process
that reads or writes them (file, group and dataset handles in
particular).

1) Is there a full featured replacement for HDF5.net<http://HDF5.net>
now, that I was unaware of? Previous contenders were found to be missing
support for features we depend on. If so will it address the corruption
issue?

2) Should we be opening and closing all the entities on every write? I
would have thought that would dramatically slow access but perhaps not.
Guidance?

3) Are there any other tips to making the file less susceptible to
corruption if writing is abandoned unexpectedly?

Please help - this issue could be serious enough to make us reconsider
our storage choice, which would be expensive now.

rgds,
Ewan  
_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@lists.hdfgroup.org
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

Reply via email to