我正在将大量小数据集写入 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 字节 = 2000 字节(忽略开销)。我不将任何属性与数据一起存储。然而,在测试中,我发现每个子组占用大约 4 kB,大约是我预期的两倍。我知道有一些开销,但是它来自哪里,我该如何减少它?是代表团体结构吗?
更多信息:
如果我将每个子组中两个数据集的维度增加到 1000 x 4 和 1000,那么每个子组占用大约 22,250 字节,而不是我预期的 20,000 字节。这意味着每个子组的开销为 2.2 kB,并且与我使用较小数据集大小得到的结果一致。有什么办法可以减少这个开销吗?
我会回答我自己的问题。仅表示组结构所涉及的开销就足够了,存储小数组或拥有多个组(每个组仅包含少量数据)是没有意义的。似乎没有任何方法可以减少每组的开销,我测得约为 2.2 kB。
我通过将每个子组中的两个数据集合并为一个 (100 x 5) 数据集来解决此问题。然后,我消除了子组,并将每组中的所有数据集合并为 3D 数据集。因此,如果我之前有 N 个子组,那么现在每个组中有一个数据集,其形状为 (N x 100 x 5)。因此,我节省了之前存在的 N * 2.2 kB 开销。此外,由于 HDF5 的内置压缩对于较大的阵列更有效,因此我现在获得了优于 1:1 的整体打包比,而以前,开销占用了文件的一半空间,压缩完全无效。
我们的教训是避免 HDF5 文件中复杂的组结构,并尝试将尽可能多的数据合并到每个数据集中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)