python - 如何减少 HDFStore 的大小开销?

标签 python pandas hdfstore

我正在试验不同的 pandas 友好存储方案来存储报价数据。迄今为止最快的(就读取和写入而言)是使用具有 blosc 压缩和“固定”格式的 HDFStore。

store = pd.HDFStore(path, complevel=9, complib='blosc')
store.put(symbol, df)
store.close()

我通过股票代码进行索引,因为这是我的常用访问模式。但是,此方案每个符号 增加了大约 1 MB 的空间。也就是说,如果微型市值股票的数据框仅包含当天的一千个报价点,则文件的大小将增加一兆字节。因此,对于大量小型股票而言,.h5 文件很快就会变得笨拙。

有没有办法在保持 blosc/fixed 格式的性能优势的同时减小尺寸?我试过“表格”格式,每个符号大约需要 285 KB。

store.append(symbol, df, data_columns=True)

但是,这种格式的读写速度非常慢。

如果有帮助,这是我的数据框的样子:

exchtime     datetime64[ns]
localtime    datetime64[ns]
symbol               object
country               int64
exch                 object
currency              int64
indicator             int64
bid                 float64
bidsize               int64
bidexch              object
ask                 float64
asksize               int64
askexch              object

blosc 压缩本身效果很好,因为生成的 .h5 文件每行仅需要 30--35 字节。所以现在我主要关心的是减少 HDFStore 中每个节点的大小损失。

最佳答案

据我所知,PyTables 中的 block 大小有一定的最小值。

这里有一些建议:

  • 您可以使用选项 chunkshape='auto' ptrepack 文件。这将使用通过查看所有数据计算得出的 block 形状来打包它,并且可以以更有效的 block 大小重新打包数据,从而产生更小的文件大小。原因是 PyTables 需要被告知最终数组/表大小的预期行数。

  • 您可以通过传递 expectedrows=(并且仅执行一次追加)在 Table 格式中实现最佳 block 大小。但是,ptrepacking 在这里仍然有优势。

  • 你也可以试试用Table格式写,不用设置所有的data_columns=True,只传format='table';它将写入表格格式(但您将无法通过索引进行查询);但它存储为单个 block ,因此几乎与固定的一样快(但空间效率更高)

  • 在 PyTables 3.1(刚刚发布)中,有一个新的 blosc 过滤器。这可能会减少文件大小。 参见 here

关于python - 如何减少 HDFStore 的大小开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21635224/

相关文章:

python - 如何通过python中的psycopg2模块取消存储在postgresql中的二进制数据?

python - 过滤列表中与每行 pandas 的条件匹配的第一个元素

python - Pandas read_hdf() 在有效的 where 条件下返回 "invalid variable reference"

python - 带有产品的 Django 购物车模型 - 实现商品数量

python - 在对象之间链接公共(public)类属性的方法? (不是继承)

python - 从多 channel 图像中提取 channel 名称

python - 更改标题行的颜色

pandas - matplotlib.axis.axes mplfinance 体积误差

python - 在 HDFStore 组中存储多个对象

Python/Pandas HDF5 NameError 问题