【发布时间】:2014-03-01 04:09:22
【问题描述】:
我有一个要保存到磁盘的树数据结构。因此,具有内部树结构的 HDF5 似乎是完美的候选者。然而,到目前为止,数据开销是巨大的,增加了 100 倍!
测试树包含大约 100 个节点,其中叶子通常包含不超过 2 或 3 个数据项(如双精度)。如果我把整棵树腌制一下,它大约有 21kB 大。然而,如果我使用 PyTables 并将树结构一对一映射到 HDF5 文件,则该文件占用 2.4MB (!) 磁盘空间。开销有那么大吗?
问题在于开销似乎不是恒定的,而是随着我的树数据的大小线性缩放(以及随着每个叶子的数据增加而增加节点,即扩大叶子表的行)。
我是否遗漏了有关 PyTables 的某些内容,例如启用压缩(我认为 PyTables 默认会这样做)?造成如此巨大开销的原因可能是什么?
非常感谢!
【问题讨论】:
-
你的叶子怎么这么小?我猜这就是你开销大的原因。
-
从一开始就无法确定这些叶子的样子(它们有多少等),它们相当独立,数据不直接相关。所以我宁愿他们分开。我仍然不介意一些开销,但一千倍大似乎很难处理。我的意思是存储 100 个节点需要 2.4 MB,真的吗?
-
为每片叶子预先分配几 K 似乎是一个合理的默认设置,不是吗?
-
糟糕,PyTables 默认不压缩!如果我将
filters=Filters(complevel=9)添加到每个表创建中,我可以将文件大小减少 15 倍。我会看看我能推多远:-)。 -
@SmCaterpillar 看起来工作正常吗?如果是这样,请发布并接受您自己的答案作为解决方案。它可能对其他人有所帮助,并且比 cmets 更容易被注意到。