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 格式。這個計劃在 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

HDF 結構舉例

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

HDF5 簡化了檔案結構，只包含兩種主要的物件型別：

資料集，它是同質型別的多維陣列；
群組，它是持有資料集和其他群組的容器結構。

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

除了這些在檔案格式上的進步，HDF5 包括了改進的型別系統，和表示在資料集區域上選擇的資料空間物件。API 是面向物件的，有關於資料集、群組、特性、型別、資料空間和屬性列表。

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

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

3.1 批評

對 HDF5 的批評來源於它的單體設計和冗長規定。

HDF5 不強制使用 UTF-8，所以客戶應用可能在多數位置上都預期 ASCII 碼。
在檔案中的資料集資料不能釋放，除非使用外部工具（h5repack）生成檔案複本。

介面

4.1 官方支援的 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

4.2 第三方繫結

CGNS，使用 HDF5 作為主儲存。
Common Lisp，透過 hdf5-cffi 庫訪問。
D 語言，提供到 C API 的繫結，有著高層 h5py 風格的包裝器正在開發。
Dymola，使用叫做科學資料格式（SDF）的實現支援 HDF5 匯出，自從 Dymola 2016 FD01 發行。
Erlang、Elixir 和語言，可以使用 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 可以透過匯入和匯出 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 資料檢視器