PyTables和HDF5:树数据的大量开销

时间:2014-02-28 09:05:19

标签: python hdf5 pytables

我有一个要保存到磁盘的树数据结构。因此,具有内部树结构的HDF5似乎是完美的候选者。但是,到目前为止,数据开销很大,只有100倍!

测试树包含大约100个节点,其中叶子通常包含不超过2或3个数据项(如双精度数)。如果我采取整棵树,只是腌制它,它大约21kB。但是,如果我使用PyTables并将树结构一对一映射到HDF5文件,则该文件占用2.4MB(!)磁盘空间。开销那么大吗?

问题在于开销似乎不是恒定的,而是随着我的树数据的大小线性扩展(以及随着每个叶子增加数据而增加节点,即扩大叶表的行)。

我是否错过了关于PyTables的内容,比如启用压缩(我认为PyTables默认会这样做)?这可能是造成这种巨额开销的原因?

非常感谢!

1 个答案:

答案 0 :(得分: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的优点之一就是它支持对表和数组进行压缩,尽管默认情况下不使用它”)