Хранение иерархических данных в hdf5-как их структурировать
Мне нужно хранить иерархическую структуру данных в hdf5, где большинство конечных узлов не являются типами массивов (строки или скаляры), а некоторые из них являются однородными массивами. Эти данные выглядят примерно так:
/simulation-20130312_13:33p1435
+- input
| +- gravity = 9.81
| +- timeScale = 1.0
| +- userTitle = 'real'
| +- flowRates = [ 1.1, 2.1 ]
| +- material
| +- density = 1234.2
| +- young = 1.123e6
| +- temp = 290.2
+- finished = '20130312_16:21'
+- host = 'efflux.local'
+- series
+- t = [0,1e-5,2e-5,...,3.4e-4]
+- Ek = [0,...]
/simulation-20130312_13:55p1657
...
...
Данные при каждом моделировании структурированы аналогично, но не обязательно идентично, поэтому я думаю, что использование таблицы невозможно.
Должен ли я создавать группы для всех листьев и всегда устанавливать значение как массив, прикрепленный к этому листу, и использовать массив 1x1, если значение это скалярно? Должен ли я использовать атрибуты группы для всех данных, кроме реальных массивов? Это не будет сбивать с толку людей, работающих с этими файлами?
У меня практически нет опыта работы с hdf5; количество данных будет относительно небольшим, на данный момент нет особой заботы об эффективности - важно иметь возможность легко импортировать данные в Matlab.
1 ответ:
HDF5 означаетиерархический формат данных , это явно правильный инструмент для хранения иерархии, подобной вашей.
Я бы рекомендовал хранить ваши листья в виде наборов данных:
Использование скалярных наборов данных для скаляров (строки, числа,
flowRatesтакже можно считать скалярным типом массива размера 2)Используйте простые наборы данных для временных рядов
И создайте группы для всех остальных узлов, например:
/simulation-20130312_13:33p1435 # root group: / +- input # group: /input | +- gravity = 9.81 # scalar double | +- timeScale = 1.0 # scalar double | +- userTitle = 'real' # scalar string | +- flowRates = [ 1.1, 2.1 ] # scalar array[2] | +- material # group: /input/material | +- density = 1234.2 # scalar double | +- young = 1.123e6 # scalar double | +- temp = 290.2 # scalar double +- finished = '20130312_16:21' # scalar string +- host = 'efflux.local' # scalar string +- series # group: /series +- t = [0,1e-5,2e-5,...,3.4e-4] # simple dataset double +- Ek = [0,...] # simple dataset doubleВ импорт в Matlab должен быть проще простого.
Comments