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），研究了用在地球觀測系統（EOS）計劃中的15種不同文件格式。在兩年評述過程之後，HDF被選擇為EOS數據和資訊系統的標準格式。

1996年美國能源部的勞倫斯利弗摩爾、洛斯阿拉莫斯和桑迪亞國家實驗室與NCSA，抽調人員成立了數據建模和格式（DMF）小組，研究滿足高級模擬和計算規劃（ASC）需要的並行I/O能力的文件格式。在NASA的額外支持下，三實驗室與NCSA，聯合開發了第一版的HDF5並於1998年發行。在2007年NASA地球觀測系統推薦使用HDF-EOS5。

## HDF4

HDF4是這個格式的較老版本，它支持可增殖的不同數據模型，包括了多維陣列、光柵圖像和表格。每種都定義了特定的聚集數據類型，並提供一個API用來讀取、寫入、組織數據和元數據。HDF開發者和使用者可以增加新數據模型。

HDF是自描述的，允許應用程式解釋文件的結構和內容而不需要外部資訊。一個HDF文件可以持有混合的有關聯的對象，它們可以作為一個群組或作為個別對象來訪問。使用者可以建立自己的叫做「vgroups」的群組結構。

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

## HDF5

HDF5格式被設計解決HDF4庫的某些限制，並致力於滿足現代系統和應用的當前和預期要求。

HDF5簡化了文件結構，只包含兩種主要的對象類型：

- 數據集，它是同質類型的多維陣列。
- 群組，它是持有數據集和其他群組的容器結構。

這真正產生了層級的、類似文件系統的數據格式。事實上，在HDF5文件中的資源可以使用類似POSIX語法的「/路徑/至/資源」來訪問。元數據以使用者定義形式存儲，命名特性附加到群組和數據集之上。表示圖形和表格的更複雜存儲API，可以接著使用數據集、群組和特性來建造起來。

除了這些在文件格式上的進步，HDF5包括了改進的類型系統，和表示在數據集區域上選擇的數據空間對象。API是面向對象的，有關於數據集、群組、特性、類型、數據空間和屬性列表。

最新版的NetCDF版本4基於了HDF5。

由於它使用了B樹來索引表格對象，HDF5有效工作於時間序列數據，比如股價序列，網路監控數據，和3D氣象數據。大批量的數據直接進入陣列（表格對象），它可以比SQL資料庫的行存儲更快訪問，而非陣列的數據可獲得B樹訪問。HDF5數據存儲機制比SQL星模式更簡單和快速。

### 批評

對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?
- HDF-EOS Tools and Information Center
- Open Navigation Surface
- HDF5使用簡介

## 基本資料

- 日語原文：Hierarchical Data Format
- 域：HDF Group的logo
- 擴展名：on
- 擴展名：`.hdf`, `.h4`, `.hdf4`, `.he2`, `.h5`, `.hdf5`, `.he5`
- magic：\211HDF\r\n\032\n
- 所有者：The HDF Group
- 類型：科學數據格式
- 免費在線檔案：Yes