我正在向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,并且与我使用较小数据集大小获得的结果一致。有没有办法减少这种开销?
答案 0 :(得分:4)
我会回答我自己的问题。仅仅表示组结构的开销足以存储小数组,或者有许多组,每个组只包含少量数据。似乎没有任何方法可以减少每组的开销,我测量的大约是2.2 kB。
我通过将每个子组中的两个数据集组合成一个(100 x 5)数据集来解决此问题。然后,我删除了子组,并将每个组中的所有数据集组合成一个3D数据集。因此,如果我以前有N个子组,我现在每组有一个数据集,形状(N x 100 x 5)。因此,我保存了先前存在的N * 2.2 kB开销。此外,由于HDF5的内置压缩对于更大的阵列更有效,我现在获得了优于1:1的整体打包率,而之前,开销占用文件空间的一半,压缩完全无效。
本课程旨在避免HDF5文件中复杂的组结构,并尝试将尽可能多的数据组合到每个数据集中。