Hierarchical Data Format(HDF)は、大量のデータを格納および構造化するために設計した一連のファイル形式(HDF4、HDF5)。米国立スーパーコンピュータ応用研究所が開発し、非営利法人である HDF グループが対応している。HDFグループは、HDF5 技術の継続的な開発と HDF で保存しデータの継続的な提供を確保することを使命としている。

HDF ライブラリと関連ツールは自由なBSDライセンスの下で幅広く利用できる。 HDF は多くの商用および非商用ソフトウェアプラットフォームとプログラミング言語でサポートされている。 無料で利用できる HDF ディストリビューションは、ライブラリ、コマンドラインユーティリティ、テストスイートソース、Java インターフェイス、Java ベースのHDFビューアー(HDFView)で構成されている。

現行の HDF5 は、旧来の HDF4 とはデザインも API も大きく異なる。

## 初期の歴史

ポータブルな科学データ形式は当初 AEHOO(All Encompassing Hierarchical Object Oriented)形式と呼ばれ、1987年に米国立スーパーコンピュータ応用研究所(NCSA)のグラフィック財団タスクフォース(GFTF)によって探求が始められた。 1990年と1992年に受け取った NSF 助成金は同プロジェクトにとって重要だった。 この頃 NASA は、地球観測システム(EOS)プロジェクトで使用するために 15 種類のファイル形式を調査した。2 年間の評価期間を経て、HDF がデータおよび情報システムの標準として採用された。

## HDF4

HDF4 はこのフォーマットの旧バージョンだが、HDF グループは現在も積極的にサポートしており、多次元配列、ラスターイメージ、テーブルなど、多様なデータモデルに対応している。それぞれに集計データタイプが定義され、データとメタデータの読み取り、書き込み、および構造化のための API が提供されている。 HDF 開発者やユーザーは、新しいデータモデルを追加できる。

HDF は自己記述型であり、アプリケーションは外部情報なしでファイルの構造と内容を解釈できる。 1つの HDF ファイルには関連するオブジェクトが混在し、それぞれがグループまたは個別のオブジェクトとしてアクセスできる。 ユーザーは、「vgroup」と呼ばれる独自のグループ化構造を作成できる。

HDF4 には多くの制限がある 。まず、明確なオブジェクトモデルがないため、継続的なサポートと改善が困難である。 多くの異なるインターフェイススタイル(画像、テーブル、配列)をサポートすることで、API が複雑になる。メタデータのサポートは、使用されているインターフェースによって異なる。 SD (Scientific Dataset)オブジェクトは任意の名前付き属性をサポートするが、他のタイプは事前定義されたメタデータのみをサポートする。 アドレス指定に32ビットの符号付き整数を使用しているため一つのファイルの容量が 2 GB までに制限されていることが一番の問題かもしれない。このことは、現代科学の多くの場面で受け入れられない。

## HDF5

HDF5は、HDF4ライブラリのいくつかの制限に対処し、モダンなシステムとアプリケーションにおける現在および将来的な要件に対応するべく設計された。2002 年にR&D 100 Awardを受賞した。

HDF5はファイル構造を単純化しており、オブジェクトのタイプには下記の 2 つしかない。

- データセット - 同じタイプの多次元配列
- グループ - データセットや他のグループを保持できるコンテナ構造

このことにより、真に階層的な、ファイルシステムのようなデータ形式になる。実際、HDF5ファイル内のリソースには、POSIX風の構文(/path/to/resource)でアクセスできる。
メタデータは、グループとデータセットに添付されたユーザー定義の名前付き属性の形式で保存される。
次に、データセット、グループ、および属性を使用して、画像とテーブルを表すより複雑なストレージAPIを構築できる。

これらのファイル形式の進歩に加えて、HDF5には、改良された型システムと、データセット領域での選択を表すデータスペースオブジェクトが含まれている。 APIは、データセット、グループ、属性、タイプ、データスペース、およびプロパティリストに関してオブジェクト指向でもある。

NetCDF の最新バージョン(version 4)は、HDF5 に基づいている。

B木を使用してテーブルオブジェクトのインデックスを作成するため、HDF5は株価シリーズ、ネットワークモニタリングデータ、3D気象データなどの時系列データに適している。
データの大部分は SQL データベースの行よりもはるかに高速にアクセスできる単純な配列(テーブルオブジェクト)となるが、非配列データにはB木アクセスを利用できる。
HDF5データストレージの機構は、SQL スタースキーマよりも単純かつ高速である。

### 批判

モノリシックな設計と長い仕様から批判されている。

- 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)
- Java

### サードパーティのバインディング

- CGNS – HDF5 をメインのストレージとして使用する
- Common Lisp – hdf5-cffi ライブラリ
- D – 開発中の高レベルの h5py スタイルの D ラッパーを使用して、C APIへのバインディングを提供する
- Dymola – リリース Dymola 2016 FD01 で SDF (Scientific Data Format) と呼ばれる実装を使用したHDF5エクスポートのサポートを導入した
- Erlang、Elixir、LFE は、BEAM 言語のバインディングを使用できる
- GNU データ言語
- Go – gonumのhdf5パッケージ。
- HDFql – C、C++、Java、Python、C#、Fortran、R の高水準言語(SQL に類似)を介して HDF5 ファイルを管理できる
- Huygens Software – バージョン3.5以降、プライマリのストレージ形式として HDF5 を使用している
- IDL
- IGOR Pro – HDF5 ファイルを完全にサポートしている
- JHDF5 – 一部のユーザーが簡単だと感じる公式の HDF5 Java バインディングとは異なるアプローチを取る代替 Java バインディング
- jHDF – HDF5ファイルへの読み取り専用アクセスを提供する純粋なJava実装
- JSON – hdf5-json 。
- Julia – HDF5パッケージを通じて HDF5 サポートを提供する
- LabVIEW – h5labview や lvhdf5 などのサードパーティライブラリを通じてHDFサポートを取得できる。
- lua-hdf5 – ライブラリを介した Lua
- MATLAB, Scilab, Octave – 最近のリリースでは、HDF5をプライマリストレージフォーマットとして使用
- Mathematica – HDF および HDF5 データの即時分析を提供する
- Perl
- Python – h5py (HDF5 概念への高レベルと低レベルの両方のアクセス)とPyTables (高度なインデックス作成とデータベースのようなクエリ機能を備えた高レベルインターフェイス)を介して HDF5 をサポートする。

HDF4 は、 Python-HDF4またはPyHDFを介して、Python 2 とPython 3 の両方で利用できる。
データ操作パッケージ pandas は、 PyTables を介してHDF5 からのインポートおよび HDF5 へのエクスポートが可能である

- R – rhdf5 および hdf5r パッケージでサポートする
- Rust – hdf5 などのサードパーティライブラリを介して HDF サポートを取得できる

## ツール

- Apache Spark HDF5 コネクタ – Apache Spark の HDF5 コネクタ
- Apache Drill HDF5 プラグイン – Apache Drill の HDF5 プラグインは、HDF5ファイルを介したSQLクエリを可能にする。
- HDF Product Designer – 相互運用可能な HDF5 データ製品作成 GUI ツール
- HDF Explorer – HDF、HDF5、netCDF データファイル形式を読み取るデータ視覚化プログラム
- HDFView – HDF ファイル用のブラウザとエディタ
- ViTables – Python で記述された HDF5 および PyTables ファイル用のブラウザおよびエディタ