HDF5 : 構造体(COMPOUND型)の書込み2013年02月27日 22:02

構造体データの書込み

HDFViewをいじって、データの追加などしてみると、通常のDatasetの追加と異なり、CompoundDS(合成型)というものがあるのに気づくと思う。今回はこれの書込み。

このデータを書き込むには構造体が必要になる。ただ構造体を宣言するのではなく、structLayout属性を追加しなければならない。これを宣言しないと外部DLLに数値を渡せない。引数のlayoutKindはsequentialを選んで構造体の宣言順にデータにする。さらにパラメータにあるPackを宣言して1バイトずつパックする宣言を追加する。
[StructLayout(LayoutKind.Sequential,Pack = 1)]
struct TestStruct
{
   public int TestInt;
   public int TestDouble;
}
続いてHDF5ファイルの書込み準備。
必要なIDを準備する。
H5DataSpaceId :
 データの配列などの大きさを指定する。今までの記事を参照

H5DataTypeId :
 H5Tクラスにあるcreateメソッドを使用する。引数にH5TクラスにあるCreateClassの列挙より"COMPOUND"を選択する。もう一つの引数には一つのデータのサイズをバイト単位で指定する。もしint型とdouble型を合成型に書き込む場合は合計サイズ4+8=12バイトを指定する。
H5DataTypeId typeID = H5T.create( H5T.CreateClass.COMPOUND,12);
さらに、このDataTypeIdを使用して、データ領域を指定していく。
使用するメソッドはH5Tクラスにあるinsertメソッド。引数は以下の通り。
 compoundDataType : 上記のH5DataTypeIdを指定
 fieldName : string型。データの名前HDFViewで表示するときや、データを参照する際に使用する
 offset : int型。データが始まる位置。詳しくは下記の例を参照
 fieldId : H5DataTypeId型。挿入するデータの型。
使用方法は下記のようにint型を挿入する場合はfieldId部には"NATIVE_INT"の列挙を使用して作成したH5DataTypeIdクラスを、double型を使用する場合は"NATIVE_DOUBLE"の列挙など、書き込むデータに合わせてH5DataTypeIdを作成する。
offsetには最初は0を指定すればいいが、次に挿入を行う場合には前回までのデータをサイズを足して書いていかなければならない。もちろん上記のCompoundのH5DataTypeIdを指定した時のサイズを超えてはならない。
H5DataTypeId intTypeId = H5T.copy(H5T.H5Type.NATIVE_INT);
H5T.insert(typeID, "IntTestData", 0, intTypeId);
H5DataTypeId doubleTypeId = H5T.copy(H5T.H5Type.NATIVE_DOUBLE);
H5T.insert(typeID, "DoubleTestData", 4, doubleTypeId);
上記の"H5T.insert"メソッドにて、1番目に使用する"H5DataTypeId"を使用して"H5DataSetId"を作成し、H5Arrayクラスを作成して書き込む。write時に使用するジェネリックの型はもちろん使用する配列型を使用する。
H5DataSetId setID = H5D.create(fileID, "COMPOUND", typeID, spaceID);
TestStruct testData = new TestStruct();
testData.TestDouble = 0.123456;
testData.TestInt = -123;
TestStruct[] testArray = new TestStruct[]{testData};
H5Array<TestStruct> array = new H5Array<TestStruct>(testArray); H5D.write<TestStruct>(setID, typeID, array);
あとは毎度のようにIDの解放処理を行う。