Одно из решений состоит в использовании интерфейс h5py
с низким уровнем H5Ocopy
function из API HDF5, в частности 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'
Выше был сгенерирован с h5py
версии 2.0.1-2+b1
и IPython версии 0.13.1-2+deb7u1
на вершине Python версии 2.7.3-4+deb7u1
от более или менее ванильной установки Debian Wheezy. Файлы f1.h5
и f2.h5
не существовали до выполнения вышеуказанного.
hf1.flush()
в команде [7]
имеет решающее значение, так как интерфейс низкого уровня, по-видимому всегда будет черпать из версии .h5
файла, хранящегося на диске, не то, что кэшируются в памяти. Копирование наборов данных в/из групп, не входящих в корень File
, может быть достигнуто путем подачи идентификатора этой группы, используя, например, hf1.get("g1").id
.
Обратите внимание, что h5py.h5o.copy
не удастся с исключением (без clobber), если объект указанного имени уже существует в целевом местоположении.
Похоже, на это был дан ответ уже: http://stackoverflow.com/questions/5346589/concatenate-a-large-number-of-hdf5-files –
@MattPavelle, насколько я понимаю, это отличается от того, что я хочу , Я не хочу объединять данные в единый набор данных, но хранить их в виде отдельных наборов данных в одном файле. – Bitwise
Получил это, спасибо за разъяснение и редактирование. И простить продолжение - прошло несколько лет с тех пор, как я играл с HDF5 - но я полагаю, что h5merge не делает трюк? –