Meinungen zu NetCDF vs HDF5 zum Speichern wissenschaftlicher Daten?

68

Hat da draußen jemand genug Erfahrung mit NetCDF und HDF5, um einige Vor- und Nachteile zu nennen, um wissenschaftliche Daten zu speichern?

Ich habe HDF5 verwendet und möchte über Java lesen / schreiben, aber die Benutzeroberfläche ist im Wesentlichen ein Wrapper um die C-Bibliotheken, was ich verwirrend fand. NetCDF scheint faszinierend, aber ich weiß fast nichts darüber.

Bearbeiten: Meine Anwendung ist "nur" für die Datenerfassung vorgesehen, sodass ich eine Datei mit einem selbstbeschreibenden Format erhalte. Wichtige Funktionen für mich sind das Hinzufügen beliebiger Metadaten, der schnelle Schreibzugriff zum Anhängen an Byte-Arrays und die gleichzeitige Verwendung von Einzelschreibern und Mehrfachlesern (stark bevorzugt, aber kein Muss. NetCDF-Dokumente geben an, dass sie über SWMR verfügen, aber nicht Sagen Sie nicht, ob sie einen Mechanismus unterstützen, mit dem sichergestellt wird, dass zwei Autoren nicht dieselbe Datei gleichzeitig öffnen können, was katastrophale Folgen hat. Ich mag die hierarchische Aspekt HDF5 (insbesondere ich liebe die gerichtete azyklische Graph Hierarchie, viel flexibler als ein „normalen“ Dateisystem-ähnliche Hierarchie), bin die NetCDF docs jetzt lesen ... wenn es ein Datensatz erlaubt nur per Datei dann wird es wahrscheinlich nicht für mich funktionieren. :(

update - sieht aus wie NetCDF-Java liest aus netCDF-4-Dateien, schreibt aber nur aus netCDF-3-Dateien, die keine hierarchischen Gruppen unterstützen. verflixt.

Update 2009-Jul-14 : Ich fange an, mich wirklich über HDF5 in Java aufzuregen. Die verfügbare Bibliothek ist nicht so toll und es gibt einige große Stolpersteine, die mit Javas Abstraktionsschichten (zusammengesetzten Datentypen) zu tun haben. Ein großartiges Dateiformat für C, aber es sieht so aus, als hätte ich gerade verloren. > :(

Jason S.
quelle
2
Nachtrag: HDF5 ist in Python mit PyTables viel einfacher zu verwenden als Java.
Jason S
Unglücklicherweise für Java-Benutzer werden sowohl netCDF als auch HDF5 in C entwickelt, hauptsächlich für C- oder Fortran-Benutzer. Die meisten anderen APIs, wie Python, werden auf der C-Ebene erstellt.)
Edward Hartnett
@ EdwardHartnett - Ich kaufe dieses Argument nicht. Sicherlich bedeutet dies, dass Sie keine netten Java-Funktionen kostenlos erhalten, aber die Leute haben den Sprung gewagt, nützliche APIs in Python zu erstellen. Es gibt keinen Grund, warum jemand dies in Java nicht tun könnte. (Und tatsächlich habe ich das selbst gemacht - in geringem Umfang - bei einer früheren Firma, als ich diese Frage 2009 gestellt habe, aber ich habe keinen Zugriff auf diesen Code.)
Jason S

Antworten:

31

Ich empfehle Ihnen dringend HDF5 anstelle von NetCDF. NetCDF ist flach und wird nach einer Weile sehr schmutzig, wenn Sie nicht in der Lage sind, Dinge zu klassifizieren. Natürlich ist die Klassifizierung auch umstritten, aber zumindest haben Sie diese Flexibilität.

Wir haben eine genaue Bewertung von HDF5 im Vergleich zu NetCDF durchgeführt, als ich Q5Cost schrieb, und das Endergebnis war zweifellos für HDF5.

Stefano Borini
quelle
44
Die Antwort ist veraltet - netCDF basiert jetzt auf HDF5
Abe
@abe nicht unbedingt. netcdf4 hat immer noch eine gewisse Abwärtskompatibilität mit netcdf3. Das bedeutet, dass einige Komprimierungsoptionen für NC-Dateien immer noch nicht verfügbar sind.
Badgley
1
@badgley - Welche Komprimierungsoptionen fehlen in netCDF, wenn damit NetCDF-4-Dateien geschrieben werden?
Sean A.
@StefanoBorini Wäre großartig, wenn Sie klären könnten, ob Ihre Bewertung noch für NetCDF-4 / HDF5 oder nur für frühere Versionen gilt.
Semisecure
1
NetCDF-4 bietet fast alle Funktionen von HDF5, einschließlich der Komprimierung. H5utils funktioniert mit netCDF-4-Dateien, die auch perfekt gültige HDF5-Dateien sind.
Edward Hartnett
23

Ich muss zugeben, dass die Verwendung von HDF5 auf lange Sicht sehr viel einfacher ist. Es ist nicht schwer, einfache Datenstrukturen in das NetCDF-Format zu bringen, aber sie später zu manipulieren, ist eine Art Schmerz.

Das "H" in HDF5 steht für "heirarchisch", was (für mich jedenfalls) zu einer WIRKLICH einfachen Möglichkeit zur Datenmanipulation führte, indem nur Knoten verschoben und Knoten von anderen Stellen aus referenziert wurden.

Kann ich fragen, was für ein Projekt das ist? Ich verwende beide für viele wissenschaftliche HPC-Modellierungsaufgaben. Kann ich davon ausgehen, dass Sie dasselbe tun? Wenn ja, ist der Trend, den ich sehe, dass Leute zu HDF5 wechseln, aber das könnte in Ihrer speziellen Domäne anders sein.

Wie auch immer Sie gehen, viel Glück!

Mike
quelle
2
afaik, NetCDF4 ist eine Art heruntergekommenes HDF5, so dass es denjenigen vertraut ist, die mit früheren Versionen von NetCDF vertraut waren. unidata.ucar.edu/mailing_lists/archives/netcdfgroup/2010/…
mdsumner
1
Es ist, aber es ist mehr, dass sie versuchen, Struktur aufzuzwingen, als dumm zu sein - unidata.ucar.edu/software/netcdf/docs/… .
Semisecure
1
NetCDF-4 stellt fast alle HDF5-Funktionen zur Verfügung, mit Ausnahme einiger kleiner, dunkler Ausnahmen.
Edward Hartnett
19

NetCDF kann ab Version 4.0 (2008) die meisten HDF5-Dateien lesen und schreiben und bietet über das erweiterte Datenmodell Zugriff auf die hierarchischen Funktionen von HDF5.

HDF5 ist äußerst funktionsreich und bietet einige großartige Leistungsmerkmale.

NetCDF verfügt über eine einfachere API und eine viel breitere Toolbasis. Es gibt viele Tools, die mit netCDF-Daten umgehen.

Edward Hartnett
quelle
Zuletzt habe ich überprüft, dass die Java-Bibliothek das Schreiben von HDF5-Dateien nicht zulässt. Wie auch immer, es ist ein strittiger Punkt, da ich mich anderen Dingen zugewandt habe. : - /
Jason S
Vielen Dank für die prägnante Antwort, das sind sehr nützliche Informationen, obwohl es noch besser wäre, wenn es einige Referenzen hätte :)
naught101
"kann die meisten HDF5-Dateien lesen und schreiben". Nein, das kann es nicht. NetCDF4 verwendet HDF5 wie eine Anwendung ein Dateisystem. Es liest und schreibt eine bestimmte Struktur, die HDF5 1.8 auferlegt wurde
Semisecure
NetCDF-4 kann alle HDF5-Dateien lesen, die keine Referenzen verwenden oder eine kreisförmige Gruppenstruktur haben. Eine vollständige Liste der Einschränkungen für HDF5-Dateien, die von netCDF-4 gelesen werden können, finden Sie in den FAQ: unidata.ucar.edu/software/netcdf/docs/…
Edward Hartnett
10

Ich weiß, dass dies ein älterer Beitrag ist, und das Originalposter hat angegeben, dass sie weitergezogen sind, aber für alle, die hier landen ... Die netCDF-Java-Bibliothek (ab 4.3.13) bietet NetCDF-4-Schreibunterstützung über das netCDF C Bibliothek. Es ist noch in der Beta, aber es funktioniert und Feedback wird auf jeden Fall geschätzt!

Weitere Informationen finden Sie in den netCDF-Java- Referenzdokumenten .

Sean A.
quelle
8

Versuchen Sie, jeweils eine kleine Beispielanwendung zu schreiben, und vergleichen Sie die Erfahrungen. Wenn Ihnen die zukünftige Skalierbarkeit Ihres Codes für die parallele Ausführung (über MPI oder ähnliches) wichtig ist, weiß ich, dass HDF eine parallele Implementierung hat, an deren Verbesserung ständig gearbeitet wird. Ich bin mir bei NetCDF nicht sicher.

Späte Bearbeitung: Für NetCDF gibt es jetzt Parallel NetCDF von Argonne. Es funktioniert ganz gut und das Entwicklungsteam ist sehr aktiv darin, es weiter zu verbessern.

Phil Miller
quelle
Parallele E / A werden auch direkt von der netCDF-Bibliothek von Unidata unterstützt, die entweder HDF5 oder parallel-netcdf verwendet, um parallele E / A bereitzustellen.
Edward Hartnett
6

1) Die Netcdf-4 C-Bibliothek ist eine Schicht über der HDF-5 C-Bibliothek. Die API wird als einfacher als die HDF5-Bibliothek angesehen, aber am Ende haben Sie fast die gleiche Funktionalität. Netcdf unterstützt keine Grafiken, HDF5 jedoch. In der Tat verhindert HDF nicht Zyklen in Ihrem Diagramm, denke ich.

2) Die HDF-Gruppe verfügt über eine Java-API über der HDF-5 C-Bibliothek.

3) Unidata verfügt über eine Netcdf-Java-Bibliothek, die reines Java ist, jedoch nur HDF-5 lesen kann.

John Caron
quelle
Da HDF5 keine gemeinsam genutzten Dimensionen implementiert, gibt es ein Argument (Haftungsausschluss: von mir), dass Sie netCDF-4 und nicht direkt HDF5 schreiben sollten. Details hier: unidata.ucar.edu/blogs/developer/en/entry/dimensions_scales .
John Caron
-2

NetCDF, das HDF5 in ein eigenes Datenmodell übersetzt, sieht gut aus und funktioniert hervorragend ... bis Sie feststellen, dass NetCDF keine vorzeichenlosen Werte unterstützt ! Siehe auch meine Frage zum Erkennen von nicht signierten Werten in vorhandenen HDF5-Dateien mithilfe von NetCDF.

Update: Es stellt sich heraus, dass NetCDF-3 zwar keine signierten Werte unterstützt, NetCDF-4 jedoch signierte Werte unterstützt, obwohl die NetCDF-API in Java zur Ermittlung der Signatur etwas kompliziert ist .

Garret Wilson
quelle
1
Ähm ... die Hälfte Ihrer Antwort besagt, dass NetCDF keine vorzeichenlosen Werte unterstützt, und die andere Hälfte schlägt vor, dass signierte Werte nicht unterstützt werden. Welches wird es sein? Der erste Link besagt nur, dass NetCDF 3 keine vorzeichenlosen Ganzzahlen hat , keine Werte im Allgemeinen. Der zweite Link zeigt außerdem an, dass das Problem bei Java und nicht bei netCDF4 liegt. Und wirklich, was macht es überhaupt aus? Dies bedeutet, dass Sie halb so viele Ganzzahlen für die Indizierung haben, aber je nach System immer noch 2 ^ 31 (= 2 Milliarden) oder 2 ^ 63 (9 * 10 ^ 18).
naught101
2
Zur Verdeutlichung unterstützt die netCDF-4 C-Bibliothek vorzeichenlose Ganzzahlen (8, 16, 32 und 64 Bit). Die netCDF-Java-Bibliothek kann keine vorzeichenlosen Typen erstellen, kann jedoch vorzeichenlose Typen der Größe 8, 16 und 32 Bit lesen, indem sie zu signierten Typen der nächstgrößeren Größe heraufgestuft werden. (Das heißt, ein vorzeichenloses 16-Bit-Ganzzahlfeld in der netCDF-Datei sieht in Java wie ein vorzeichenbehaftetes 32-Bit-Feld aus.) Dies alles ist darauf zurückzuführen, dass Java keine vorzeichenlosen Typen unterstützt.
Edward Hartnett