Eine Lösung ist die h5py
Schnittstelle zum Low-Level-H5Ocopy
function der HDF5 API zu verwenden, insbesondere die h5py.h5o.copy
function:
In [1]: import h5py as h5
In [2]: hf1 = h5.File("f1.h5")
In [3]: hf2 = h5.File("f2.h5")
In [4]: hf1.create_dataset("val", data=35)
Out[4]: <HDF5 dataset "val": shape(), type "<i8">
In [5]: hf1.create_group("g1")
Out[5]: <HDF5 group "/g1" (0 members)>
In [6]: hf1.get("g1").create_dataset("val2", data="Thing")
Out[6]: <HDF5 dataset "val2": shape(), type "|O8">
In [7]: hf1.flush()
In [8]: h5.h5o.copy(hf1.id, "g1", hf2.id, "newg1")
In [9]: h5.h5o.copy(hf1.id, "val", hf2.id, "newval")
In [10]: hf2.values()
Out[10]: [<HDF5 group "/newg1" (1 members)>, <HDF5 dataset "newval": shape(), type "<i8">]
In [11]: hf2.get("newval").value
Out[11]: 35
In [12]: hf2.get("newg1").values()
Out[12]: [<HDF5 dataset "val2": shape(), type "|O8">]
In [13]: hf2.get("newg1").get("val2").value
Out[13]: 'Thing'
Die oben mit h5py
Version 2.0.1-2+b1
und ipython Version erzeugt wurde 0.13.1-2+deb7u1
über Python Version 2.7.3-4+deb7u1
von einer mehr oder weniger Vanille-Installation von Debian Wheezy. Die Dateien f1.h5
und f2.h5
existierten nicht vor der Ausführung des oben genannten.
Die hf1.flush()
in Befehl [7]
ist von entscheidenden Bedeutung, da der Low-Level-Schnittstelle scheinbar immer von der Version der auf der Festplatte gespeichert .h5
Datei ziehen wird, nicht, dass im Arbeitsspeicher zwischengespeichert. Das Kopieren von Datensätzen zu/von Gruppen, die nicht an der Wurzel von File
sind, kann durch Liefern der ID dieser Gruppe unter Verwendung von beispielsweise hf1.get("g1").id
erreicht werden.
Beachten Sie, dass h5py.h5o.copy
mit einer Ausnahme (kein Clobber) fehlschlägt, wenn ein Objekt mit dem angegebenen Namen bereits am Zielort existiert.
Sieht aus wie dies bereits beantwortet wurde: http://stackoverflow.com/questions/5346589/concatenate-a-large-number-of-hdf5-files –
@MattPavelle soweit ich verstehe das ist anders als was ich will . Ich möchte die Datensätze nicht zu einem einzelnen Dataset verketten, sondern sie als separate Datasets in einer Datei speichern. – Bitwise
Hab es, danke für die Klarstellung und die Bearbeitung. Und vergib das Follow-up - es ist ein paar Jahre her, seit ich mit HDF5 gespielt habe - aber ich nehme an, dass h5merge nicht den Trick macht? –