2012-09-18 58 views
1

我試圖通過在創建表格時指定chunkshape來提高我的pytables/HDF5代碼的性能。我無法弄清楚chunkshape參數的真實尺寸或格式。我可以從代碼中看到,它最終會以單個元素的形式出現。優化pytables/HDF5的chunkshape參數以讀取整列

這個單個元素應該是行數,字節數還是什麼?

我的具體問題是我有現有的代碼,創建一個20列的HDF5表。我想更改表的塊,以便每個列連續存儲在磁盤上。因此,一次優化讀取整個列。

我試着將chunkshape設置爲20(列數),但這大大降低了讀取整列的性能。應該將塊形狀設置爲單行的寬度(以字節爲單位)?

我只是想知道chunkshape應該是什麼,如果:

  1. 我想盡可能快地閱讀一整列。
  2. 我知道表中有多少列。
  3. 我不能只是簡單地將表更改爲具有現有行作爲列,反之亦然,出於向後兼容性的原因。
+0

我強烈建議你問這個問題到PyTables郵件列表。你可以在那裏得到非常好的支持。 – Vicent

回答

3

PyTableschunkshape規定(這就是爲什麼它是一個元組的原因)每行和列的元素應該連續在磁盤上存儲的數量。因此,舉例來說,如果您的數據集是10,000 x 20(10,000行,20列),並且您始終只訪問一個列,則每個塊應儘可能包含儘可能多的列,因爲您的最佳組塊大小(詳見here)。

如果你知道你將多少行,他們都不是巨大的,你可以指定(10.000,1)(或更少行)一個chunkshape。所以如果你訪問所有20列,它將需要20次訪問。

+0

我看到它是一個對應於行和列的元組。這與HDF5和'chunksize'的文檔一致。但是,pytables實際上並不允許通過此參數設置2元組(行和列)。當試圖將chunkshape設置爲(1,20)時,我得到一個錯誤,抱怨'rank必須是1'。爲什麼這個參數是'chunkshape',如果它只使用我傳遞它的元組的第一個元素?我如何使用'chunkshape'來儘可能少地訪問整個列來優化讀取整個列? –

+0

這很奇怪,因爲根據[this](http://www.pytables.org/trac-bck/browser/PyTablesPro/trunk/bench/chunkshape-bench.py​​?rev=3895)一個正常的元組應該工作。你也可以嘗試指定'expectedrows'參數,讓PyTables計算出最佳的'chunkshape',然後輸出它,看看它是否適合你。 –

+0

我會研究'expectedrows'。與此同時,這裏是我看到的錯誤消息,當使用元組'chunkshape','ValueError:chunkshape等級(長度)必須是1:(23,1)'。 –