【问题标题】:PyTables and HDF5: Massive overhead for tree dataPyTables 和 HDF5:树数据的大量开销
【发布时间】: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 更容易被注意到。

标签: python hdf5 pytables


【解决方案1】:

好的,所以我找到了一种大幅减小文件大小的方法。关键是,尽管我之前认为,PyTables 不会默认应用压缩。

您可以使用Filters 实现此目的。

这是一个如何工作的示例:

   import pytables as pt

   hdf5_file = pt.openFile(filename = 'myhdf5file.h5', 
                           mode='a', 
                           title='How to compress data') 
   # for pytables >= 3 the method is called `open_file`, 
   # other methods are renamed analogously

   myfilters = Filters(complevel=9, complib='zlib')

   mydescitpion = {'mycolumn': pt.IntCol()} # Simple 1 column table

   mytable = hdf5_file.createTable(where='/', name='mytable',
                                     description=mydescription,
                                     title='My Table',
                                     filters=myfilters)
   #Now you can happily fill the table...

这里重要的一行是Filters(complevel=9, complib='zlib')。它指定了 压缩级别complevel 和压缩算法complib。默认情况下,级别设置为 0,这意味着压缩被禁用,而 9 是最高压缩级别。有关压缩工作原理的详细信息:HERE IS A LINK TO THE REFERENCE

下一次,我最好坚持使用 RTFM :-)(虽然我做到了,但我错过了“PyTables 的一个优点是它支持对表和数组进行压缩,尽管默认情况下不使用它”)

【讨论】:

  • 我以前也陷入过这个陷阱。默认情况下禁用压缩可能是正确的,但它并没有像应该的那样经常/清楚地从文档中跳出来。如果您追求最佳 IO 性能,我强烈推荐 blosc 压缩库(当然,您的数据/应用程序可能会确定哪个压缩库最好)。
  • 我对使用 blosc 犹豫不决。如果我使用 blosc 存储数据,我将无法再使用 hdfview 浏览和查看它。如果我打开通过 blosc 保存的表或数组,则会引发错误。
猜你喜欢
  • 2015-10-10
  • 2020-02-15
  • 2015-10-21
  • 2012-12-29
  • 2011-12-21
  • 1970-01-01
  • 2020-04-03
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多