2014-02-07 120 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