如何将层次数据存储到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 个回答
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中导入这些数据应该非常简单。