HDF5チュートリアル: 基礎編
ある狭い分野でよく使われるHDF5形式なるもののチュートリアルです。 私が必要に駆られて備忘録的に(適当に)翻訳しています。 原文はThe HDF Group - Information, Support, and Softwareとなります。
このチュートリアルではHDF5の基本的な特徴を扱います。各テーマは独立しておらず、順番に達成されることが意図されています。いくつかのセクションでは以前のセクションで作られたファイルを使います。サンプルはHDF5 Introductory Examplesページから見つけることもできます。
- HDF5のファイル構造
- HDF5 API
- HDF5ファイルの作成
- [未翻訳] Creating a Dataset
- [未翻訳] Reading From and Writing To a Dataset
- [未翻訳] Creating an Attribute
- [未翻訳] Creating a Group
- [未翻訳] Creating Groups Using Absolute and Relative Names
- [未翻訳] Create Datasets in Groups
- [未翻訳] Reading From or Writing to a Subset of a Dataset
- [未翻訳] Datatypes
- [未翻訳] Property Lists
- [未翻訳] Dataset Storage Layout: Contiguous, Chunked, Compact
- [未翻訳] Extendible Datasets
- [未翻訳] Compressed Datasets
[未翻訳] Discovering the Contents of an HDF5 File
[未翻訳] Questions / Answers
3. HDF5ファイルの作成
3.1. HDF5ファイルって何?
HDF5ファイルとは科学データと補助メタデータから成るバイナリファイルです。
HDF5ファイルを作るには、プリケーションはファイル名だけではなく、ファイルアクセスモード
、ファイル作成プロパティリスト
とファイルアクセスプロパティリスト
を指定する必要が有ります。これら用語を以下に示します。
ファイルアクセスモード (File access mode)
:
ファイル作成時、既にファイルが存在した場合の動きを決めます。
H5F_ACC_TRUNC
はファイルが既に存在する場合、アプリケーションが新しいデータをファイルに上書きするため現在の内容は削除される事を示す。H5F_ACC_EXCL
はファイルが存在する場合にはopenが失敗する。ファイルが存在しなければ、ファイルアクセスパラメータは無視される。
いずれの場合でも、アプリケーションは作成が成功したファイルに対して読み書きができます。
存在するファイルを開く場合には2つの異なるアクセスモードがあることに注意してください:
H5F_ACC_RDONLY
はアプリケーションが読み込みアクセスすることを示すが、データの書き込みは許可しない。H5F_ACC_RDWR
はアプリケーションが読み書きアクセスすることを示す。
ファイル作成プロパティリスト (File creation property list)
:
ファイル作成プロパティリストはファイルメタデータの制御に使われます。ファイルメタデータにはユーザーブロック*1のサイズについての情報で成り立ち、様々なファイルのデータ構造のサイズがHDF5ライブラリ等により使われます。このチュートリアルでは、デフォルトのファイル作成プロパティリストであるH5P_DEFAULT
が使われます。
ファイルアクセスプロパティリスト (File access property list)
:
ファイルアクセスプロパティリストはファイルにおいてI/O操作の異なるメソッドの制御に使われます。加えてファイルの閉じられ方の制御にも使う事ができます (あるファイルによる全てのオブジェクトが閉じられるまで、実ファイルのクローズを遅らせるかどうか)。デフォルトのファイルアクセスプロパティリストであるH5P_DEFAULT
がこのチュートリアルでは使われます。
ファイルアクセス、作成のプロパティリストとアクセスモードの詳細については H5F section of the HDF5 Users' Guide and Reference Manualを参照してください。
HDF5ファイルの作成と閉じるの手順は以下となります。
- ファイル作成とプロパティリストとアアクセスプロパティリストを(必要なら)指定する。
- ファイルを作成する。
- ファイルと、必要ならプロパティリストも閉じる。
3.2. サンプルプログラム
内容
以下はHDF5ファイルの作成と閉じ方のサンプル*2です。
C:
#include "hdf5.h" #define FILE "file.h5" int main(void) { hid_t file_id; // ファイル識別子 herr_t status; // デフォルトプロパティでファイルを作成する。 file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); // ファイルへのアクセスを終わらせる。 status = H5Fclose(file_id); return 0; }
注記
hdf5.h
というヘッダファイルは定義と宣言を含んでいるので、HDF5ライブラリを使うあらゆるプログラムはインクルードする必要があります。
H5Fcreate
: HDF5ファイルを作り、ファイル識別子を返します。ファイル作成時に自動的にrootグループが作られます。全てのファイルにはrootグループがあり、rootグループのパス名は必ず/
となります。
H5Fclose
: HDF5ファイルへのアクセスと終わらせます。HDF5にもうプログラムからアクセスしないならば、ファイルを使用によるリソースを解放するためにH5Fcloseを呼ぶべきです。 この呼び出しは必ず行う必要が有ります。
あるファイルに対してH5Fcloseが呼ばれた際に、そのファイルに含まれる1つ以上のオブジェクトがまだ開かれている場合、オブジェクトが個別に閉じられるまで、それらオブジェクトにアクセス可能なままとなります。もしオブジェクトが不注意にも開かれたままだと、これは他のユーザに対するアクセス問題の原因となります。ファイルアクセスプロパティはそのファイルの閉じられ方を制御します。
ファイルの中身
HDF GroupeはHDF5ファイルの中身を調べるためのツールを開発しました。HDF5チュートリアルを通して使われるそのツールはHDF5のダンパーであり、h5dump
と言い、人に読みやすい形に変換してファイルの内容を表示します。h5dump
の出力はHDF5 DDL文法に則る形でのASCII表示です。この文法はHDF5に対してBNF(バッカス・ナウア記法)によるDDL(Data Definition Language, データ定義言語)で定義されています。
HDF5の内容を見るためには以下のように打ち込みます。
$ h5dump <filename>
図4.1はfile.h5
の中身を有向グラフで表しています。
図4.1 file.h5
の中身
図4.2はfile.h5
をテキストで表したものです(h5dump
で作成)。file.h5
とよばれるHDF5ファイルは/
やルートグループと呼ばれるグループで成り立ちます。
HDF5 "./file.h5" {
GROUP "/" {
}
}
図4.2 DDLでのfile.h5
DDLによるファイル定義
図4.3はHDF5ファイルを作成するための簡略化DDLファイル定義です。簡単のため、簡略化DDLがこのチュートリアル上では使われます。完璧かつ厳密なDDLはHDFに対応するBNFによるDDL、HDF5 User's Guideの項目から見つけることができます。
以下の記号定義がDDLとして使われる。
::=
: 定義する<tname>
: tnameという名前を持ったトークン<a> | <b>
: <a>か<b>のどちらか<a>*
: <a>の0以上の出現ファイル定義の簡略化DDLは以下のようになる:
- <file> ::= HDF5 "<file_name>" { <root_group> }
- <root_group> ::= GROUP "/" { <group_attribute>* <group_member>* }
- <group_attribute> ::= <attribute>
- <group_member> ::~ <group> | <dataset>
図4.3 HDF5ファイル定義
[HDF5] 2. HDF5 API
HDF5ライブラリはいくつかのインターフェイスやAPIを提供しています。これらAPIはHDF5ファイルやオブジェクトを作成、アクセス、操作するためのルーチンです。 ライブラリ自体はCで実装されています。FORTRAN 90, C++, Jacaプログラマーの仕事をやり易くするために、これら言語毎にHDF5関数のラッパーが開発されています。このチュートリアルではCとFORTRANラッパーを使って話を進めます。
HDF5ライブラリの全CルーチンはH5*
という接頭辞で始まり、この*
は目的の関数操作に応じた1、2文字の英大文字となります。FORTRANラッパーはh5
から始まり_f
で終わる形のサブルーチンとなります。
APIを以下に示します。
API | 内容 |
---|---|
H5 | ライブラリ関数群: 一般目的 (general-purpose) のH5関数 |
H5A | 注釈 (Annotation) インターフェイス: 属性のアクセスと操作ルーチン |
H5D | データセット (Dataset) インターフェイス: データセットのアクセスと操作ルーチン |
H5E | エラー (Error) インターフェイス: エラーハンドリングのルーチン |
H5F | ファイル (File) インターフェイス: ファイルアクセスのルーチン |
H5G | グループ (Group) インターフェイス: グループの作成と処理のルーチン |
H5I | 識別子 (Identifier) インターフェイス: 識別子のルーチン |
H5L | リンク (Link)インターフェイス: リンクのルーチン |
H5O | オブジェクト (Object) インターフェイス: オブジェクトのルーチン |
H5P | プロパティリスト(Property List) インターフェイス: オブジェクトプロパティリスト操作のルーチン |
H5R | リファレンス(Reference) インターフェイス: 参照のルーチン |
H5S | データ空間(Dataspace) インターフェイス: データ空間定義とアクセスのルーチン |
H5T | データ型(Datatype) インターフェイス: データ型作成と操作のルーチン |
H5Z | 圧縮 (Compression) インターフェイス: 圧縮のルーチン |
[HDF5] 1. 基礎的なHDF5ファイル構造
HDF5ファイルは色々な科学データを記憶するための容れ物で、主に2つのオブジェクト (groupsとdatasets) から成り立っています。
あらゆるHDF5 group、datasetに属性(attribute)を付加できま。HDF5 attrtibute
はユーザが定義する、HDF5オブジェクトの追加情報を示すHDF5構造です。
groupsとdatasetsの働きはUNIXのディレクトリとファイルの働きに色々な意味で似ています。UNIXのディレクトリとファイルの様に、HDF5ファイル内のHDFオブジェクトはしばしばフルパス (絶対バスとも) で示されます。
- '/'はrootグループを示す。
- '/foo'はfooと呼ばれるrootグループのメンバーを示す。
- '/foo/zoo'はfooグループのメンバーを示し、fooはrootグループのメンバーである。
Thinking with Joinsの邦訳 [D3.js]
Joinを考える (Thinking with Joins)
Mike BostockのThinking with Joins (February 5, 2012)の邦訳。 ところどころ怪しいです。
続きを読むLet’s Make a Bar Chart part 3の邦訳[D3.js]
棒グラフを作ろう その3
November 13, 2013Mike BostocのLet’s Make a Bar Chart, IIIを邦訳したもの。part 2はコチラ。 今回の翻訳は意訳が多いので、ご注意ください。
続きを読む