我正在试验不同的熊猫友好型存储方案的刻度数据。到目前为止,最快(在读写方面)一直在使用HDFStore和blosc压缩以及“固定”格式。如何减少HDFStore的大小开销?
store = pd.HDFStore(path, complevel=9, complib='blosc')
store.put(symbol, df)
store.close()
我使用股票代码进行索引,因为这是我的常见访问模式。但是,该方案每个符号增加了约1MB的空间。也就是说,如果微型储存器的数据帧在当天仅包含一千个刻度,则该文件将增加一兆字节。因此,对于大量小型股票来说,.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
@Jeff任何选项,特别是我应该传递给'ptrepack'?如果我不给出任何选项,则生成的文件大小相同。 – chrisaycock
你可以试试''chunkshape'';我不知道这是否会改变大小。 – Jeff