我正在将大量小型数据集写入一个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,并且与我在较小数据集大小下获得的结果一致。有什么方法可以减少这种开销吗?
发布于 2013-03-08 11:05:29
我会回答我自己的问题。仅表示组结构所涉及的开销就足够了,因此存储小数组或拥有许多组(每个组只包含少量数据)是没有意义的。似乎没有任何方法可以减少每个组的开销,我测量的开销大约是2.2 kB。
我通过将每个子组中的两个数据集合并为一个(100 X 5)数据集解决了这个问题。然后,我去掉了子组,并将每个组中的所有数据集合并为一个3D数据集。因此,如果我以前有N个子组,那么现在每个组中都有一个形状为(N X 100 X 5)的数据集。因此,我节省了以前存在的N* 2.2 kB开销。此外,由于HDF5的内置压缩对于更大的数组更有效,我现在得到了比1:1更好的总体压缩比,而以前,开销占用了文件空间的一半,压缩完全无效。
教训是要避免HDF5文件中复杂的组结构,并尝试将尽可能多的数据组合到每个数据集中。
https://stackoverflow.com/questions/14332193
复制相似问题