我正在试验不同的适合熊猫的蜱虫数据存储方案。到目前为止,最快的(在读写方面)是使用带有blosc压缩和“固定”格式的HDFStore。在
store = pd.HDFStore(path, complevel=9, complib='blosc')
store.put(symbol, df)
store.close()
我用股票代码索引,因为这是我常用的访问模式。然而,这个方案为每个符号增加大约1MB的空间。也就是说,如果microcap股票的数据帧只包含当天的1000个滴答声,那么文件的大小将增加一兆字节。因此,对于一个小股票的大宇宙,.h5
文件很快变得难以处理。在
有没有一种方法既能保持blosc/固定格式的性能优势,又能减小大小?我尝试过“table”格式,每个符号大约需要285kb。在
^{pr2}$但是,这种格式的读写速度要慢得多。在
如果有帮助的话,我的数据框如下所示:
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中,块大小有一定的最小值。在
以下是一些建议:
您可以使用选项
ptrepack
该文件。这将使用chunkshape对其进行打包,该chunkshape是通过查看所有数据来计算的,并且可以将数据重新打包为更有效的块大小,从而使文件大小更小。原因是PyTables需要知道最终数组/表大小的预期行数。您可以通过传递
expectedrows=
(并且只执行一次追加)来实现Table
格式的最佳chunksize。但是,ptrepacking
在这里仍然有好处。您也可以尝试以表格式写入,而不是设置所有
data_columns=True
,只需传递format='table'
;它将写入表格式(但除了按索引之外,您将无法查询);但它存储为单个块,因此它的速度应该与固定的一样快(但空间效率更高)在PyTables 3.1(刚刚发布)中,有一个新的
blosc
过滤器。这可能会减少文件大小。 请参见here相关问题 更多 >
编程相关推荐