2013-01-15 49 views
6

我正在將大量的小數據集寫入HDF5文件,生成的文件大小大約是我投入的數據的天真表格的10倍。我的數據分層組織如下所示:HDF5存儲開銷

group 0 
    -> subgroup 0 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    -> subgroup 1 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    ... 
group 1 
... 

每個小組應占用500 * 4字節= 2000字節,忽略開銷。我不會在數據旁邊存儲任何屬性。然而,在測試中,我發現每個小組佔用大約4 kB,大約是我預期的兩倍。我知道有一些開銷,但它從哪裏來,我該如何減少它?它是代表團體結構嗎?

更多信息: 如果我將每個子組中兩個數據集的維數增加到1000 x 4和1000,那麼每個子組佔據大約22,250個字節,而不是我期望的平均20,000個字節。這意味着每個子羣的開銷爲2.2 kB,並且與我用較小的數據集大小得到的結果一致。有什麼辦法可以減少這種開銷嗎?

+3

HDF5文件格式[非常複雜](http://www.hdfgroup.org/HDF5/doc/H5.format.html)。它使用內部阻塞來存儲數據和元數據對象。元數據的默認塊大小爲2 KiB,每個(子)組都有自己的頭部空間,這解釋了觀察到的差異大約爲2000字節。您可以嘗試使用「COMPACT」存儲 - 有關存儲策略的更多信息,請參閱(4.5)[此處](http://www.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html)。 –

+2

上面給出的數字是用'COMPACT'設置的。這樣做的教訓是避免收集少量數據的複雜的羣體結構。將所有數據集合到一個更大的數組中並應用壓縮後,我的壓縮比達到1:1(壓縮節省的空間比HDF5開銷增加更多)。 – Thucydides411

+0

@ Thucydides411你的評論是最佳答案!你應該把它寫在答案中並接受它。 – Simon

回答

4

我會回答我自己的問題。涉及代表組結構的開銷就足夠了,因此存儲小數組或者有許多組只包含少量數據是沒有意義的。似乎沒有什麼辦法可以減少每個組的開銷,我測得的開銷約爲2.2 kB。

我通過將每個子組中的兩個數據集組合到一個(100 x 5)數據集中解決了此問題。然後,我刪除了子組,並將每個組中的所有數據集組合成一個3D數據集。因此,如果我以前有N個子組,則每個組中都有一個數據集,形狀爲(N x 100 x 5)。因此,我保存了之前存在的N * 2.2 kB開銷。此外,由於HDF5的內置壓縮對於較大的陣列更有效,因此我現在可以獲得比1:1更高的整體填充率,而之前的開銷佔用了文件空間的一半,壓縮效果完全無效。

本課旨在避免HDF5文件中的複雜組結構,並嘗試將盡可能多的數據組合到每個數據集中。

+1

是的,沒有。科學家創建HDF5以存儲大量數據集。我認爲迷戀超過2Kb就是錯過了這一點。如果你的空間受到限制,那麼這可能是你錯誤的圖書館。試圖儘可能將數據描述爲自描述是值得的,即使這需要幾Kb也是如此。就像你可以寫出'聰明'的代碼一樣,你可以建立'聰明'的數據結構,但摩爾定律是編寫可維護代碼和自描述數據結構的人的一面。 –

+0

我想我回答了這個問題。如果您要存儲大量的小數據集,則每個數據集2kB是一個值得關注的問題。如果可能的話,我的答案是將數據打包成更大的數據集。我沒有提出複雜的結構:一個3D數據集,每個軸都有一個含義,非常簡單。 – Thucydides411