2013-01-15 50 views
6

我正在将大量的小数据集写入HDF5文件,生成的文件大小大约是我投入的数据的天真表格的10倍。我的数据分层组织如下所示:HDF5存储开销

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,并且与我用较小的数据集大小得到的结果一致。有什么办法可以减少这种开销吗?

+3

HDF5文件格式[非常复杂](http://www.hdfgroup.org/HDF5/doc/H5.format.html)。它使用内部阻塞来存储数据和元数据对象。元数据的默认块大小为2 KiB,每个(子)组都有自己的头部空间,这解释了观察到的差异大约为2000字节。您可以尝试使用“COMPACT”存储 - 有关存储策略的更多信息,请参阅(4.5)[此处](http://www.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html)。 –

+2

上面给出的数字是用'COMPACT'设置的。这样做的教训是避免收集少量数据的复杂的群体结构。将所有数据集合到一个更大的数组中并应用压缩后,我的压缩比达到1:1(压缩节省的空间比HDF5开销增加更多)。 – Thucydides411

+0

@ Thucydides411你的评论是最佳答案!你应该把它写在答案中并接受它。 – Simon

回答

4

我会回答我自己的问题。涉及代表组结构的开销就足够了,因此存储小数组或者有许多组只包含少量数据是没有意义的。似乎没有什么办法可以减少每个组的开销,我测得的开销约为2.2 kB。

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

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

+1

是的,没有。科学家创建HDF5以存储大量数据集。我认为迷恋超过2Kb就是错过了这一点。如果你的空间受到限制,那么这可能是你错误的图书馆。试图尽可能将数据描述为自描述是值得的,即使这需要几Kb也是如此。就像你可以写出'聪明'的代码一样,你可以建立'聪明'的数据结构,但摩尔定律是编写可维护代码和自描述数据结构的人的一面。 –

+0

我想我回答了这个问题。如果您要存储大量的小数据集,则每个数据集2kB是一个值得关注的问题。如果可能的话,我的答案是将数据打包成更大的数据集。我没有提出复杂的结构:一个3D数据集,每个轴都有一个含义,非常简单。 – Thucydides411