HDF5
HDF5
HDF5HDF5 group (Hierarchical Data Format 5)は、階層的な科学データ(3D, 4Dなど)を保存するためのファイルフォーマットおよびライブラリです。 HDFViewを使って,その構造を見ることができます。
Imarisが利用するファイルフォーマットもHDF5フォーマットですが,特別なタグが必要です。
libhdf5の使い方
ファイルの作り方
{ hid_t fileID; heer_t stutus; fileID = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); status = H5Fclose(fileID); }
アクセスモード H5F_ACC_TRUNC ファイルがあったら,新しくつくりなおす
H5F_ACC_EXCL ファイルがあったら失敗する H5F_ACC_RDONLY 読みとりのみ H5F_ACC_RDWR 読み書き
File Creation Property List
H5P_DEFAULT
File Access Property List
H5P_DEFAULT
+--integer +--floating point +----atomic ----+--date and time | +--character string HDF5 datatypes --| +--bitfield | +--opaque | +----compound
Chunkingと拡張可能なデータセット
[https://www.asc.ohio-state.edu/wilkins.5/computing/HDF/hdf5tutorial/extend.html]を参照
拡張可能なデータセットの作成
拡張可能なデータセットとは、次元を拡張することができるデータセットのことです。HDF5では、あるデータセットをある初期次元で定義し、その後その初期次元のいずれかのサイズを大きくすることができます。
HDF5では、拡張可能なデータセットを定義するためにチャンキングを使用する必要があります。これにより、ストレージを必要以上に再配置することなく、データセットを効率的に拡張することができます。
拡張可能なデータセットを記述するためには、以下の操作が必要です。
1.データセットのデータ空間を、最終的に拡張される可能性のあるすべての次元に対して無制限であると宣言しておく。 2.データセット作成のプロパティを設定し、チャンキングを可能にする。 3.データセットを作成する。 4.データセットのサイズを拡張する。
プログラミングの例
説明
この例では、3×3の拡張可能なデータセットを作成し、そのデータセットに書き込み、データセットを10×3に拡張し、再びそのデータセットに書き込む方法を示しています。
[C 言語の例 ] - h5_extend.c
/************************************************************** * * This example shows how to work with extendible datasets. * In the current version of the library a dataset MUST be * chunked in order to be extendible. * * This example is derived from the h5_extend_write.c and * h5_read_chunk.c examples that are in the "Introduction * to HDF5". * *************************************************************/ #include "hdf5.h" #define FILE "ext.h5" #define DATASETNAME "ExtendibleArray" #define RANK 2 int main (void) { hid_t file; /* handles */ hid_t dataspace, dataset; hid_t filespace; hid_t cparms; hid_t memspace; hsize_t dims[2] = { 3, 3}; /* dataset dimensions at creation time */ hsize_t dims1[2] = { 3, 3}; /* data1 dimensions */ hsize_t dims2[2] = { 7, 1}; /* data2 dimensions */ hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; hsize_t size[2]; hssize_t offset[2]; hsize_t i,j; herr_t status, status_n; int data1[3][3] = { {1, 1, 1}, /* data to write */ {1, 1, 1}, {1, 1, 1} }; int data2[7] = { 2, 2, 2, 2, 2, 2, 2}; /* Variables used in reading data back */ hsize_t chunk_dims[2] ={2, 5}; hsize_t chunk_dimsr[2]; hsize_t dimsr[2]; int data_out[10][3]; int rank, rank_chunk; /* Create the data space with unlimited dimensions. */ dataspace = H5Screate_simple (RANK, dims, maxdims); /* Create a new file. If file exists its contents will be overwritten. */ file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Modify dataset creation properties, i.e. enable chunking */ cparms = H5Pcreate (H5P_DATASET_CREATE); status = H5Pset_chunk ( cparms, RANK, chunk_dims); /* Create a new dataset within the file using cparms creation properties. */ dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, dataspace, cparms); /* Extend the dataset. This call assures that dataset is 3 x 3.*/ size[0] = 3; size[1] = 3; status = H5Dextend (dataset, size); /* Select a hyperslab */ filespace = H5Dget_space (dataset); offset[0] = 0; offset[1] = 0; status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, dims1, NULL); /* Write the data to the hyperslab */ status = H5Dwrite (dataset, H5T_NATIVE_INT, dataspace, filespace, H5P_DEFAULT, data1); /* Extend the dataset. Dataset becomes 10 x 3 */ dims[0] = dims1[0] + dims2[0]; size[0] = dims[0]; size[1] = dims[1]; status = H5Dextend (dataset, size); /* Select a hyperslab */ filespace = H5Dget_space (dataset); offset[0] = 3; offset[1] = 0; status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, dims2, NULL); /* Define memory space */ dataspace = H5Screate_simple (RANK, dims2, NULL); /* Write the data to the hyperslab */ status = H5Dwrite (dataset, H5T_NATIVE_INT, dataspace, filespace, H5P_DEFAULT, data2); /* Close resources */ status = H5Dclose (dataset); status = H5Sclose (dataspace); status = H5Sclose (filespace); status = H5Fclose (file); /**************************************************************** Read the data back ***************************************************************/ file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT); dataset = H5Dopen (file, DATASETNAME); filespace = H5Dget_space (dataset); rank = H5Sget_simple_extent_ndims (filespace); status_n = H5Sget_simple_extent_dims (filespace, dimsr, NULL); cparms = H5Dget_create_plist (dataset); if (H5D_CHUNKED == H5Pget_layout (cparms)) { rank_chunk = H5Pget_chunk (cparms, 2, chunk_dimsr); } memspace = H5Screate_simple (rank,dimsr,NULL); status = H5Dread (dataset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, data_out); printf("\n"); printf("Dataset: \n"); for (j = 0; j < dimsr[0]; j++) { for (i = 0; i < dimsr[1]; i++) printf("%d ", data_out[j][i]); printf("\n"); } status = H5Pclose (cparms); status = H5Dclose (dataset); status = H5Sclose (filespace); status = H5Sclose (memspace); status = H5Fclose (file); }
[FORTRAN の例 ] - chunk.f90
注:Makefileを含むサンプルのtarファイルをダウンロードするには、参考文献のページを参照してください。
備考 ルーチンH5Pcreate / h5pcreate_fは、プロパティリストのインスタンスとして新しいプロパティを作成します。シグネチャは以下の通りです。
C:
hid_t H5Pcreate (H5P_class_t classtype)
FORTRAN
H5PCREATE_F (CLASSTYPE, PRP_ID, HDFERR) classtype IN: INTEGER prp_id OUT: INTEGER(HID_T) hdferr OUT: INTEGER
パラメータ classtype は、作成するプロパティリストのタイプである。有効なクラスタイプは以下の通りです。
C | FORTRAN |
H5P_FILE_CREATE
H5P_FILE_ACCESS H5P_DATASET_CREATE H5P_DATASET_XFER H5P_MOUNT |
H5P_FILE_CREATE_F
H5P_FILE_ACCESS_F H5P_DATASET_CREATE_F H5P_DATASET_XFER_F H5P_MOUNT_F |
C言語では、成功した場合はプロパティリストの識別子が返され、失敗した場合は負の値が返されます。FORTRANでは、プロパティリストの識別子をprp_idで、呼び出しの戻り値をhdferrで返します。
ルーチンH5Pset_chunk / H5Pset_chunk_fは、チャンクされたレイアウトデータセットを格納するために使用されるチャンクのサイズを設定します。このルーチンのシグネチャは次のとおりです。 C:
herr_t H5Pset_chunk (hid_t prp_id, int ndims, const hsize_t * dims)
FORTRAN:
H5PSET_CHUNK_F (PRP_ID, NDIMS, DIMS, HDFERR) prp_id IN: INTEGER(HID_T) ndims IN: INTEGER dims IN: INTEGER(HSIZE_T), DIMENSION(ndims) hdferr OUT: INTEGER
・prp_idパラメータは、問い合わせるプロパティリストの識別子である。 ・ndimsパラメータは各チャンクの次元数である。 ・dims パラメータは各チャンクのサイズを含む配列です。
C言語では,成功すれば非負の値が,失敗すれば負の値が返されます. FORTRANでは、戻り値はhdferrで返されます:成功した場合は0、それ以外の場合は-1です。
H5Dextend / H5Dextend_f ルーチンは無制限の次元を持つデータセットを拡張します。シグネチャは次の通りである。
C:
herr_t H5Dextend (hid_t dset_id, const hsize_t * size)
FORTRAN
H5DEXTEND_F (Dset_ID、Size、HDERR) dset_id IN: INTEGER(HID_T) サイズ IN: 整数(hsize_t), 次元(*) hdferr OUT: INTEGER
dset_id パラメータはデータセット識別子である. size パラメータは、各次元の新しい大きさを含む配列である。 C言語では、この関数は成功すれば非負の値を、そうでなければ負の値を返す。 FORTRANでは、戻り値はhdferrで返される: 成功すれば0、そうでなければ-1。
H5Dget_create_plist / H5Dget_create_plist_f ルーチンは、データセットに対するデータセット作成プロパティリストのコピーの識別子を返します。 C関数H5Pget_layoutは、データセットの生データのレイアウトを返します。有効な型はH5D_CONTIGUOUSとH5D_CHUNKEDです。H5Pget_layoutのFORTRANルーチンはまだ存在しません。
H5Pget_chunk / H5Pget_chunk_fルーチンは、チャンクされたレイアウトデータセットの生データのチャンクの大きさを取得します。シグネチャは以下の通りです。 C:
int H5Pget_chunk (hid_t prp_id, int ndims, hsize_t * dims)
FORTRAN:
H5PGET_CHUNK_F (PRP_ID, NDIMS, DIMS, HDFERR) prp_id IN: INTEGER(HID_T) ndims IN: INTEGER dims OUT: INTEGER(HSIZE_T), DIMENSION(ndims) hdferr OUT: INTEGER
prp_id パラメータは、問い合わせるプロパティリストの識別子である。 ndims パラメータは dims 配列のサイズである。 dimsパラメータは、チャンクの寸法を格納する配列です。 C では、この関数は成功すればチャンクの次元を返し、そうでなければ負の値を返します。 FORTRANでは、戻り値はhdferrに返されます:成功した場合はチャンクのランク、そうでない場合は-1です。
H5Pclose / H5Pclose_fルーチンは、プロパティリストへのアクセスを終了させます。シグネチャは次の通りです。
C:
Herr_t H5Pclose (hid_t prp_id)
FORTRAN
H5PCLOSE_F (PRP_ID, HDFERR) prp_id IN: INTEGER(HID_T) hdferr OUT: INTEGER
prp_id パラメータは、アクセスを終了させるプロパティリストの識別子である。