2014-02-07 87 views
2

我正在试验不同的熊猫友好型存储方案的刻度数据。到目前为止,最快(在读写方面)一直在使用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中每个节点的大小惩罚。

+1

AFAIK它们是PyTables中块大小的一定最小值;你可以看看“ptrepack”这个文件的各种选项。恕我直言,最低1MB是合理的。你也可以用''Table''格式来写,而不是设置所有的''data_columns = True'',只要通过''format ='table''';它会编写表格格式(但除了索引之外,您将无法查询);但它作为一个单独的块存储,所以应该几乎与固定一样快(但是有更多的空间效率)。 – Jeff

+0

@Jeff任何选项,特别是我应该传递给'ptrepack'?如果我不给出任何选项,则生成的文件大小相同。 – chrisaycock

+1

你可以试试''chunkshape'';我不知道这是否会改变大小。 – Jeff

回答

3

AFAIK PyTables中的块大小有一定的最小值。

以下是一些建议:

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

  • 通过传递expectedrows=(并且只执行一个附加操作),可以实现Table格式的最佳块大小。但是,ptrepacking在这里仍然有好处。

  • 你也可以试着写表格格式,而不是全部设置data_columns=True,只是通过format='table';它会编写表格格式(但除了索引之外,您将无法查询);但它存储为一个单独的块,因此应该几乎与固定一样快(但是更高效)

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