HDF

層級數據格式（Hierarchical Data Format：HDF）是設計用來存儲和組織大量數據的一組文件格式（HDF4，HDF5）。它最初開發於美國國家超級計算應用中心，現在由非營利社團HDF Group支持，其任務是確保HDF5技術的持續開發和存儲在HDF中數據的持續可訪問性。
伴隨著這個目標，HDF庫和相關工具可在自由的類BSD許可證下獲得用於一般使用。HDF被很多商業和非商業軟件平臺所支持，包括Java、MATLAB、Scilab、Octave、Mathematica、IDL、Python、R、Fortran和Julia。可免費獲得的HDF發行中包括了庫，命令行實用程序，測試套件源代碼，Java接口，和基於Java的HDF查看器（HDFView）。
當前版本是HDF5，在設計和API上與主要的遺留版本HDF4有顯著區別。

**歷史**
在1987年由美國國家超級計算應用中心（NCSA）的圖形基礎任務攻堅組（GFTF），著手建立一種架構無關的軟件庫和文件格式，致力於滿足NCSA在當時使用的多種不同計算平臺之間，移送科學數據的需要。額外的目標還包括：有效的存儲和訪問大對象的能力，在一個容器內存儲不同類型的眾多對象的能力，增長格式來容納新類型的對象和對象元數據的能力，用C和Fortran二者的程序訪問存儲數據的能力。最初稱為AEHOO（全包容層級面向對象格式），新軟件和文件格式，最終叫做層級數據格式（HDF）。HDF的設計組合了來自很多不同格式的想法，包括TIFF、CGM、FITS和Macintosh PICT格式。這個計劃在1990年和1992年，收到了美國國家科學基金會（NSF）的至關重要的撥款。大約1990年代早期美國國家航空航天局（NASA），研究了用在Earth Observing System（EOS）計劃中的15種不同文件格式。在兩年評述過程之後，HDF被選擇為EOS數據和信息系統的標準格式。
1996年美國能源部的勞倫斯利弗摩爾、洛斯阿拉莫斯和桑迪亞國家實驗室與NCSA，抽調人員成立了數據建模和格式（DMF）小組，研究滿足高級模擬和計算規劃（ASC）需要的並行I/O能力的文件格式。在NASA的額外支持下，三實驗室與NCSA，聯合開發了第一版的HDF5並於1998年發行。在2007年NASAEarth Observing System推薦使用HDF-EOS5。

**HDF4**
HDF4是這個格式的較老版本，它支持可增殖的不同數據模型，包括了多維陣列、光柵圖像和表格。每種都定義了特定的聚集數據類型，並提供一個API用來讀取、寫入、組織數據和元數據。HDF開發者和用戶可以增加新數據模型。
HDF是自描述的，允許應用程序解釋文件的結構和內容而不需要外部信息。一個HDF文件可以持有混合的有關聯的對象，它們可以作為一個群組或作為個別對象來訪問。用戶可以建立自己的叫做“vgroups”的群組結構。

HDF4格式有很多限制。它缺乏清晰的對象模型，這導致持難於持續支持和改進。支持多種不同的接口風格（圖像、表格、陣列）導致了複雜的API。對元數據的支持依賴於使用的是哪個接口；SD（科學數據集）對象支持任意命名屬性，而其他類型只支持預定義的元數據。可能最重要的問題，是使用32-bit位有符號整數尋址，限制了HDF4文件大小極大為2GB，這在很多現代科學應用中是不可接受的。它仍被HDF Group活躍支持著，可見於其支持頁面。

**HDF5**
HDF結構舉例
HDF5格式被設計解決HDF4庫的某些限制，並致力於滿足現代系統和應用的當前和預期要求。
HDF5簡化了文件結構，只包含兩種主要的對象類型：
*數據集，它是同質類型的多維陣列；
*群組，它是持有數據集和其他群組的容器結構。
這真正產生了層級的、類似文件系統的數據格式。事實上，在HDF5文件中的資源可以使用類似POSIX語法的“/路徑/至/資源”來訪問。元數據以用戶定義形式存儲，命名特性附加到群組和數據集之上。表示圖形和表格的更復雜存儲API，可以接著使用數據集、群組和特性來建造起來。
除了這些在文件格式上的進步，HDF5包括了改進的類型系統，和表示在數據集區域上選擇的數據空間對象。API是面向對象的，有關於數據集、群組、特性、類型、數據空間和屬性列表。
最新版的NetCDF版本4基於了HDF5。
由於它使用了B樹來索引表格對象，HDF5有效工作於時間序列數據，比如股價序列，網絡監控數據，和3D氣象數據。大批量的數據直接進入陣列（表格對象），它可以比SQL數據庫的行存儲更快訪問，而非陣列的數據可獲得B樹訪問。HDF5數據存儲機制比SQLStar schema更簡單和快速。

**批評**
對HDF5的批評來源於它的單體設計和冗長規定。
*HDF5不強制使用UTF-8，所以客戶應用可能在多數位置上都預期ASCII碼。
*在文件中的數據集數據不能釋放，除非使用外部工具（h5repack）生成文件複本。

**接口**

**官方支持的API**
 C- C++- CLI - .Net- Fortran，Fortran 90- HDF5 Lite (H5LT) – 輕量級C接口- HDF5 Image (H5IM) – 圖像和光柵的C接口- HDF5 Table (H5TB) – 表格的C接口- HDF5 Packet Table (H5PT) – 處理“包”數據的C和C++接口，高速訪問- HDF5 Dimension Scale (H5DS) – 允許向HDF5增加維度縮放 
*Java

**第三方綁定**
 CGNS，使用HDF5作為主存儲。- Common Lisp，通過hdf5-cffi庫訪問。- D語言，提供到C API的綁定，有著高層h5py風格的包裝器正在開發。- Dymola，使用叫做科學數據格式（SDF）的實現支持HDF5導出，自從Dymola 2016 FD01發行。- Erlang、Elixir和LFE語言，可以使用BEAM語言綁定。- GNU數據語言，支持訪問HDF5和HDF4。- Go語言，通過gonum的hdf5包。- HDFql，使用戶能用C、C++、Java、Python、C#、Fortran和R語言通過高層語言（類似SQL）管理HDF5文件。- Huygens軟件，自從版本3.5使用HDF5作為主存儲。- IDL，提供訪問HDF5的API。- IGOR Pro，提供對HDF5文件的完全支持。- JHDF5庫，是一個可替代的Java綁定，採用了與官方HDF5 Java綁定不同的方式，一些用戶覺得更簡單。- jHDF庫，一個純Java實現，提供了對HDF5文件的只讀訪問。- JSON，通過hdf5-json。- Julia語言，通過HDF5包提供HDF5支持。- LabVIEW，可以通過第三方庫獲得HDF支持，比如h5labview和lvhdf5。- Lua，通過lua-hdf5庫。- MATLAB、Scilab或Octave，在新近發行中使用HDF5作為主存儲格式。- Mathematica HDF導入和導出，提供HDF和HDF5數據的直接分析。- Perl語言，通過PDL::IO::HDF5訪問。- Python語言，對於HDF5，可通過支持抽象高層訪問和低層訪問二者的h5py，或通過具有高級索引和類似數據庫查詢能力的高層接口的PyTables。對於HDF4，可通過Python-HDF4和/或PyHDF。流行的數據操縱包pandas可以通過PyTables導入和導出HDF5。- R語言，通過rhdf5和hdf5r包提供支持。- Rust語言，通過第三方庫獲得HDF支持，比如hdf庫。

**工具**
 Apache Spark HDF5 Connector，用於Apache Spark的HDF5連接器- Apache Drill HDF5 Plugin，用於Apache Drill的HDF5插件，允許在HDF5文件集上執行SQL查詢- HDF Product Designer，可互操作的HDF5數據產品建立GUI工具- HDF Explorer，可讀取HDF、HDF5和netCDF的數據可視化程序- HDFView，基於Java的HDF文件的瀏覽器和編輯器- ViTables，用Python寫的HDF5和PyTables文件的瀏覽器和編輯器- Panoply，基於Java的netCDF、HDF和GRIB數據查看器

**參見**
通用數據格式 (CDF)
*FITS，用於天文學的數據格式
*GRIB (GRIdded Binary)，用於氣象學的數據格式
*NetCDF，Netcdf Java庫使用純Java讀取HDF5、HDF4、HDF-EOS和其他格式 
*Protocol Buffers，Google的數據交換格式

**引用**

**外部鏈接**
 What is HDF5? date=20210118110412 - HDF-EOS Tools and Information Center date=20201105151319 - Open Navigation Surface date=20201209231650 - HDF5使用簡介