本節書摘來自異步社群《python和hdf 5大資料應用》一書中的第1章,第1.2節,作者[美]andrew collette(科萊特),胡世傑 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
hdf5是一種存儲相同類型數值的大數組的機制,适用于可被層次性組織且資料集需要被中繼資料标記的資料模型。
它跟sql風格的關系型資料庫差別相當大,hdf5在組織結構方面有一些特殊的技巧(第8章中有一個例子)。如果你需要在多個表上保持關系,或者想要在資料上進行join,那麼一個關系型資料庫可能更适合你。又或者你需要在一台沒有安裝hdf5的機器上讀取一個小型的1維資料集,那麼csv這樣的文本格式是更合理的選擇。
但如果你需要處理多元數組,對性能有非常高的要求,需要在資料集上支援子集分片和部分i/o,需要用特征來給資料集做标記,對關系型特性沒有要求,那麼hdf5就是完美的選擇。
那麼說到底,“hdf5”究竟是指什麼?我确信它包含下面3點:
1.一種檔案規格及相關的資料模型;
2.一個可被c、c++、java,python以及其他語言使用的api标準庫;
3.一個軟體生态系統,由使用hdf5的客戶程式以及matlab、idl和python等“分析平台”組成。
你已經在上面的例子見到hdf5資料模型的三大要素:
資料集:一種數組型對象,在磁盤上儲存數值類型的資料;
組:層次性容器,可以包含資料集和子組;
特征:自定義中繼資料資訊,可被附加在資料集(以及組!)上。
使用者可以使用這些基本抽象建構适合自己問題域的應用格式。比如,我們之前的氣象站代碼為每個氣象站分了一個組,為每個測量參數配置設定一個資料集,并附加了一些特征以描述資料集的額外資訊。這種統一使用“格式内格式”來決定如何用組、資料集和特征來儲存資訊的方式在實驗室或者其他機構中是非常普遍的。
既然hdf5處理一切如“endian”的跨平台問題,資料的分享就隻需要對組、資料集和特征進行簡單操作并獲得結果。由于檔案是自我描述的,你甚至不需要了解應用格式就可以從檔案中擷取資料。你隻需打開檔案并浏覽其内容:

任何曾經在讀取“簡單”二進制格式檔案上花費數小時琢磨位元組偏移量的人都應該對此充滿感激。
最後,hdf5檔案的底層位元組布局是開放的規格。比起專利軟體的二進制格式,這裡面沒有任何隐秘。雖然基本上人們都會使用hdf組織提供的庫來通路這些檔案,但是你自己寫一個軟體去讀也沒有任何問題。
該庫主要用c語言寫成,對c++和java有一些額外的綁定。人們說起“hdf5”時通常就是指這個庫。兩大脍炙人口的python接口子產品pytables和h5py使用的就是這個由hdf組織提供的c庫。
這個标準庫最主要的一點在于開發者對它的積極維護以及在向下相容方面花費的巨大精力。标準庫的向下相容不僅僅是api的相容,亦包括檔案格式的相容。對于hdf5這樣的歸檔檔案格式來說,相容性是一個非常必需的特性。而api相容則使h5py和pytables這樣的子產品有能力處理世界上各種不同版本的hdf5。
對于科學資料的存儲,包括長期的存儲,你應該對hdf5有信心。由于标準庫和檔案格式都是開源的,哪怕一顆流星摧毀了伊利諾伊州,你的檔案依然能夠被讀取。
最後,讓hdf5特别有用的一個原因是你可以在幾乎任何平台上讀寫檔案。idl語言已經支援hdf5好多年了;matlab現在甚至以hdf5作為其“.mat”儲存檔案的預設格式;python、c++、java、.net和labview以及其他語言對其都有支援。nasa地球觀測系統等機構使用者使用的“eos5”格式是建立在hdf5容器之上的應用格式,剛才我們見到的其實是其簡化以後的例子。甚至作為hdf5競争對手之一的netcdf,其最新的netcdf4格式也是實作在hdf5的組、資料集和特征之上。
希望我上面介紹的這些能夠讓你了解hdf5在科學用途上所向披靡的原因。接下來,我們将看到hdf5工作的基本原理并開始在python上使用它。