PyTables和HDF5:树d的巨大开销

2024-06-26 00:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我是否错过了一些关于PyTables的东西,比如启用压缩(我认为PyTables默认会这么做)?为什么会有这么大的开销?在

非常感谢!在


Tags: 文件数据数据结构节点精度mbpytables结构
1条回答
网友
1楼 · 发布于 2024-06-26 00:12:13

好的,所以我找到了一种方法来大幅度减小文件大小。关键是,尽管我之前相信,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的一个优点是它支持对表和数组进行压缩,尽管默认情况下不使用它”)

相关问题 更多 >