Contents

HDF5の概要

  • 汎用バイナリ形式 (言語非依存)
  • ファイル中に階層構造を保持
  • 種々のデータを保存可能
  • メタデータを格納
  • データの部分読込みが可能 (メモリ使用量低減)
  • 部分更新可能なため、ファイル圧縮も容易 (データセットをchunkに分割)
  • クロスプラットフォーム対応
  • pickleより若干IOが遅いが、csvと比べるとかなり高速
  • Group (Dict) : ディレクトリ
  • Dataset (ndarray): ファイル
  • Attribute: プロパティ
FILE_PATH = "hoge.hdf5"

# hdf5を読込み、Datasetを出力する関数
def read_hdf5(file_path):

    # Datasetを出力する関数
    def print_data(name, obj):
        if isinstance(obj, h5py.Dataset):
            print(f"========= {name} =========", "\n", obj[...], "\n")
            for key, value in obj.attrs.items():
                print(f"{key}: {value}")   # Datasetにattributeがあればそれも表示

    # hdf5を読込むwith文
    with h5py.File(file_path, "r") as f:
        f.visititems(print_data)

if __name__ == "__main__":
    read_hdf5(FILE_PATH)
FILE_PATH = "hoge.hdf5"

# hdf5を作成するwith文
with h5py.File(file_path, "w") as f:
    arr1 = np.random.random(size=(10, 10))
    arr2 = np.random.random(size=(20, 20))

    group1 = f.create_group("group1")
    dataset1 = group1.create_dataset(name="dataset1", data=arr1, compression="gzip)
    dataset2 = f.create_dataset(name="group2/dataset2", data=arr2)
    dataset2[0,0] = 1
    dataset2.attrs['description'] = 'TEST'
    dataset2.attrs['id'] = 1234