8

我正在将大量小型数据集写入 HDF5 文件,生成的文件大小大约是我所输入的数据的幼稚列表所期望的 10 倍。我的数据按层次结构组织如下:

group 0
    -> subgroup 0
        -> dataset (dimensions: 100 x 4, datatype: float)
        -> dataset (dimensions: 100, datatype: float)
    -> subgroup 1
        -> dataset (dimensions: 100 x 4, datatype: float)
        -> dataset (dimensions: 100, datatype: float)
    ...
group 1
...

每个子组应占用 500 * 4 Bytes = 2000 Bytes,忽略开销。我不会在数据旁边存储任何属性。然而,在测试中,我发现每个子组占用大约 4 kB,或者​​大约是我预期的两倍。我知道有一些开销,但它来自哪里,我该如何减少它?是在代表组结构吗?

更多信息:如果我将每个子组中两个数据集的维度增加到 1000 x 4 和 1000,那么每个子组占用大约 22,250 字节,而不是我预期的 20,000 字节。这意味着每个子组的开销为 2.2 kB,并且与我使用较小数据集大小得到的结果一致。有没有办法减少这种开销?

4

1 回答 1

6

我会回答我自己的问题。仅表示组结构所涉及的开销就足够了,以至于存储小型数组或拥有许多组,每个组只包含少量数据是没有意义的。似乎没有任何方法可以减少每组的开销,我测得的开销约为 2.2 kB。

我通过将每个子组中的两个数据集组合成一个 (100 x 5) 数据集来解决这个问题。然后,我消除了子组,并将每个组中的所有数据集组合成一个 3D 数据集。因此,如果我之前有 N 个子组,我现在在每个组中都有一个数据集,形状为 (N x 100 x 5)。因此,我保存了之前存在的 N * 2.2 kB 开销。此外,由于 HDF5 的内置压缩对更大的阵列更有效,因此我现在获得了优于 1:1 的整体打包率,而在此之前,开销占用了文件空间的一半,压缩完全无效。

教训是避免 HDF5 文件中复杂的组结构,并尝试将尽可能多的数据组合到每个数据集中。

于 2013-03-08T03:05:28.763 回答