如何将层次数据存储到hdf5中 - 该如何结构化

2 投票
1 回答
990 浏览
提问于 2025-04-17 18:49

我需要把一种层级的数据结构存储到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中导入这些数据应该非常简单。

撰写回答