【发布时间】:2014-03-05 07:20:50
【问题描述】:
我正在试验不同的熊猫友好型存储方案来存储刻度数据。迄今为止最快的(就读写而言)是使用具有 blosc 压缩和“固定”格式的 HDFStore。
store = pd.HDFStore(path, complevel=9, complib='blosc')
store.put(symbol, df)
store.close()
我按股票代码索引,因为这是我常用的访问模式。但是,此方案每个符号增加了大约 1 MB 的空间。也就是说,如果一只微型股票的数据框只包含当天的一千个刻度,则该文件的大小将增加一兆字节。因此,对于大量小型股票,.h5 文件很快就会变得笨拙。
有没有办法在保持 blosc/固定格式的性能优势的同时减小尺寸?我尝试过“表格”格式,每个符号大约需要 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 中每个节点的大小损失。
【问题讨论】:
-
AFAIK 它们是 PyTables 中块大小的某个最小值;您可以查看
ptrepack文件的各种选项。至少 1MB 可能是合理的恕我直言。也可以尝试写成Table的格式,不用设置全部data_columns=True,直接传format='table'即可;它将写入表格格式(但您将无法通过索引查询);但它存储为单个块,因此应该几乎与固定一样快(但空间效率更高)。 -
@Jeff 我应该将任何选项特别传递给
ptrepack?如果我不提供任何选项,则生成的文件大小相同。 -
你可以试试
chunkshape;我不知道这是否会改变大小。 -
@Jeff
chunkshape=auto缩小文件!我将对此进行试验,看看效果如何。 -
真的吗?那太棒了。仅供参考,它们也是 PyTables 3.1(刚刚发布)中的一个新的 blosc 过滤器,请参见此处:pytables.github.io/release-notes/RELEASE_NOTES_v3.1.x.html;不确定更新后的 blosc 会做什么(我认为 pandas 将直接通过参数传递,如果它不起作用,请提交错误报告 - 目前 pandas 不验证压缩器)