Python PyTables和HDF5:树数据的巨大开销

Python PyTables和HDF5:树数据的巨大开销,python,hdf5,pytables,Python,Hdf5,Pytables,我有一个要保存到磁盘的树数据结构。因此,具有内部树状结构的HDF5似乎是完美的候选者。然而,到目前为止,数据开销是巨大的,是100倍 一个测试树包含大约100个节点,其中叶子通常包含不超过2或3个数据项(如双精度)。如果我把整棵树都腌了,它大概有21kB大。但是,如果我使用PyTables并将树结构一一映射到HDF5文件,该文件将占用2.4MB(!)磁盘空间。头顶有那么大吗 问题在于,开销似乎不是恒定的,而是随着树数据的大小而线性扩展(以及随着每个叶数据的增加而增加节点,即扩大叶表的行) 我是否

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

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

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

我是否遗漏了一些关于PyTables的内容,比如启用压缩(我认为PyTables默认会这样做)?造成如此巨大开销的原因可能是什么


非常感谢

好的,我找到了一种方法来大幅减小文件大小。关键是,尽管我之前相信,PyTables并没有按照默认值应用压缩

您可以通过使用
过滤器
来实现这一点

下面是一个如何工作的示例:

   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...
这里重要的一行是过滤器(complevel=9,complib='zlib')。它指定了 压缩级别
complevel
和压缩算法
complib
。默认情况下,级别设置为0,这意味着禁用压缩,而9是最高压缩级别。有关压缩工作原理的详细信息:


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

为什么有这么小的叶子?我猜这就是你开销大的原因。从一开始就不确定这些叶子是什么样子的(有多少等),它们是相当独立的,数据也没有直接关系。所以我更希望他们分开。尽管如此,我还是不介意一些开销,但千倍的开销似乎难以解决。我的意思是存储100个节点需要2.4 MB,真的吗?每个叶子预先分配几个K似乎是一个合理的默认值,不是吗?哎呀,PyTables默认情况下不会压缩!如果我将
filters=filters(complevel=9)
添加到每个表创建中,我可以将文件大小减少15倍。我要看看我能把它推多远:-)。@SmCaterpillar看起来工作正常吗?如果是这样,请发布并接受您自己的答案作为解决方案。它可能会帮助其他人,而且比评论更容易被注意到。我以前也掉进过这个陷阱。默认情况下禁用压缩可能是正确的,但它只是没有像应该的那样频繁/清晰地从文档中跳出。如果您追求最佳IO性能,我强烈推荐使用blosc压缩库(当然,您的数据/应用程序可能会决定哪个压缩库是最佳的)。我不太愿意使用blosc。如果我使用blosc存储数据,我将无法再使用hdfview浏览和查看数据。如果打开通过blosc保存的表或数组,则会引发错误。