h5py 徹底解説: 大規模データを超高速に扱うHDF5とPythonの連携!

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks

データサイエンスや機械学習のプロジェクトでは、GB(ギガバイト)からTB(テラバイト)規模の膨大なデータを扱うことが日常的になりつつあります。CSVファイルでは処理しきれない、メモリに乗り切らない、そんな大規模データとの戦いで強力な味方となるのが、HDF5 (Hierarchical Data Format 5) 形式のファイルと、Pythonからそれを扱うためのライブラリh5pyです。

この記事では、h5pyの基本的な使い方から、HDF5の階層構造、効率的なデータ読み書き、そして大規模データセットの管理まで、h5pyを使いこなすために必要な情報を徹底的に解説します。

HDF5とh5pyってどんなもの?

HDF5 (Hierarchical Data Format 5)

HDF5は、複雑な構造を持つ大規模な数値データを効率的に保存・管理するために設計されたファイル形式です。その名の通り、ファイルシステムのように階層構造を持っており、データを「グループ」と「データセット」という要素で整理します。

  • グループ (Group): ディレクトリ(フォルダ)のようなもので、他のグループやデータセットを格納できます。

  • データセット (Dataset): ファイル(ファイル)のようなもので、NumPy配列のような多次元の数値データを格納します。

HDF5は、単一のファイル内に異なるデータ型やサイズのデータを混在させることができ、メモリに乗り切らない巨大なデータもディスクから直接効率的に読み書きできる「アウトオブコア」処理が可能です。

h5py

h5pyは、PythonからHDF5ファイルを簡単に操作するためのライブラリです。NumPyと密接に統合されており、HDF5ファイル内のデータセットをまるでNumPy配列のように扱うことができます。

h5pyでできること

  • HDF5ファイルの作成・読み書き: 簡単にHDF5ファイルを作成し、データを保存・読み込みます。

  • 階層構造の操作: グループを作成・移動し、データを整理します。

  • 大規模データセットの効率的なアクセス: メモリに乗り切らないデータも、必要な部分だけを読み込んだり、直接書き込んだりできます。

  • NumPy配列とのシームレスな連携: データセットをNumPy配列として直接扱えるため、NumPyの強力な機能と組み合わせて高速な計算が可能です。

  • メタデータの保存: データセットやグループに属性(メタデータ)を付加し、データの管理を容易にします。


なぜh5pyを選ぶべきか?

大規模データを扱う際にh5pyが選ばれる理由には、以下のような点が挙げられます。

  • パフォーマンス: 大規模な数値データの読み書きにおいて、CSVやpickleなどの一般的な形式よりも圧倒的に高速です。

  • メモリ効率: 全データを一度にメモリにロードする必要がないため、RAMの制約を気にせず巨大なデータセットを扱えます。

  • 柔軟なデータ構造: 階層構造により、複雑なデータも整理して保存できます。

  • NumPyとの統合: データサイエンスの標準ツールであるNumPyと親和性が高く、既存のコード資産を活かせます。

  • クロスプラットフォーム: HDF5ファイルは異なるOS間でも互換性があり、共有しやすいです。


h5pyを始めるための準備

1. インストール

h5pyはpipで簡単にインストールできます。

Bash
 
pip install h5py

2. インポート

Pythonスクリプトでh5pyを使用する際は、通常以下のようにインポートします。

Python
 
import h5py
import numpy as np

h5pyの基本的な使い方と機能一覧

1. HDF5ファイルの作成とオープン

h5py.File()を使ってHDF5ファイルを作成または既存のファイルを開きます。

mode引数でファイルの操作モードを指定します。

  • 'w' (write): 新規作成。既存のファイルがあれば上書き。

  • 'w-' (write, fail if exists): 新規作成。既存のファイルがあればエラー。

  • 'a' (append): 既存のファイルを開き、追記モード。ファイルがなければ新規作成。

  • 'r' (read): 読み込み専用。

Python
 
# ファイルの作成 (wモード)
with h5py.File('my_data.hdf5', 'w') as f:
    print("ファイル 'my_data.hdf5' を作成しました。")
print("\n")

# ファイルを読み込みモードで開く
with h5py.File('my_data.hdf5', 'r') as f:
    print("ファイル 'my_data.hdf5' を読み込みモードで開きました。")
    # ここではまだデータがない
print("\n")

2. データセットの作成とデータ書き込み

create_dataset()メソッドを使ってデータセットを作成し、NumPy配列などを書き込みます。

Python
 
with h5py.File('my_data.hdf5', 'a') as f: # 追記モードで開く
    # 'data_int'という名前のデータセットを作成し、整数データを書き込む
    f.create_dataset('data_int', data=np.arange(10))

    # 'data_float'という名前で、形状とデータ型を指定して空のデータセットを作成し、後から書き込む
    # chunks=True を指定すると、大規模データでの効率的な読み書きが可能になる(必須ではないが推奨)
    dset_float = f.create_dataset('data_float', (5, 5), dtype='f', chunks=True)
    dset_float[:] = np.random.rand(5, 5) # データセット全体に値を代入

    print("データセット 'data_int' と 'data_float' を作成し、データを書き込みました。")
print("\n")

3. データセットの読み込みとアクセス

データセットは、ファイルオブジェクトの属性として、または辞書のようにキーでアクセスできます。アクセスしたデータセットはNumPy配列のように扱えます。

Python
 
with h5py.File('my_data.hdf5', 'r') as f:
    # データセットへのアクセス
    data_int_read = f['data_int'][:] # スライス[:]で全データをNumPy配列として読み込む
    data_float_read = f['data_float'][:]

    print("読み込んだ 'data_int':", data_int_read)
    print("読み込んだ 'data_float':\n", data_float_read)
    print("data_intのデータ型:", data_int_read.dtype)
    print("data_floatの形状:", data_float_read.shape)
    print("\n")

    # データセットの一部だけを読み込む(メモリ効率が良い)
    partial_data = f['data_int'][2:7]
    print("data_intの2から6番目の要素:", partial_data)
    print("\n")

4. グループの作成と階層構造の操作

create_group()メソッドでグループを作成し、ファイルシステムのようにデータを整理できます。

Python
 
with h5py.File('my_data.hdf5', 'a') as f:
    # 'group_A'という名前のグループを作成
    grp_A = f.create_group('group_A')

    # 'group_A'の中にデータセットを作成
    grp_A.create_dataset('sub_data_1', data=np.array([10, 20]))

    # さらに深い階層のグループを作成し、データセットを格納
    grp_B = grp_A.create_group('sub_group_B')
    grp_B.create_dataset('sub_data_2', data=np.ones((2,2)))

    # パス指定で直接作成も可能
    f.create_dataset('group_A/sub_group_B/sub_data_3', data=np.zeros(3))

    print("階層構造を持つグループとデータセットを作成しました。")
    print("ファイル内のオブジェクト:", list(f.keys()))
    print("group_A内のオブジェクト:", list(f['group_A'].keys()))
print("\n")

5. メタデータ(属性)の追加

データセットやグループには、attrs属性を使ってメタデータを追加できます。これはデータの付随情報として非常に役立ちます。

Python
 
with h5py.File('my_data.hdf5', 'a') as f:
    # データセットに属性を追加
    f['data_int'].attrs['unit'] = 'meter'
    f['data_int'].attrs['description'] = 'Sample integer data'

    # グループに属性を追加
    f['group_A'].attrs['created_by'] = 'Data Scientist A'

    print("属性を追加しました。")
print("\n")

with h5py.File('my_data.hdf5', 'r') as f:
    # 属性の読み込み
    print("data_intの単位:", f['data_int'].attrs['unit'])
    print("group_Aの作成者:", f['group_A'].attrs['created_by'])
    print("data_intの全属性:", dict(f['data_int'].attrs))
print("\n")

6. 既存データの参照と削除

ファイル内のオブジェクトをリスト表示したり、削除したりすることも可能です。

Python
 
with h5py.File('my_data.hdf5', 'a') as f:
    print("ファイル内のオブジェクト (削除前):", list(f.keys()))

    # データセットの削除
    if 'data_int' in f:
        del f['data_int']
        print("データセット 'data_int' を削除しました。")

    print("ファイル内のオブジェクト (削除後):", list(f.keys()))
print("\n")

h5pyをより深く使いこなすために

  • チャンク (Chunking): create_dataset()chunks=Trueまたはタプルを指定することで、データセットをチャンク(小さなブロック)に分割して保存できます。これにより、データのサブセットへのアクセスが非常に効率的になります。大規模データでは必須の設定です。

  • 圧縮 (Compression): compression引数(例: 'gzip', 'lzf')を指定することで、データセットを圧縮して保存し、ファイルサイズを削減できます。読み書き速度とファイルサイズのトレードオフがあります。

  • 高レベルAPI vs 低レベルAPI: h5pyは、使いやすい高レベルAPI(本記事で紹介した内容)の他に、より詳細な制御が可能な低レベルAPIも提供しています。


まとめ

この記事では、大規模な数値データを効率的に扱うためのHDF5ファイル形式と、Pythonからそれを操作するh5pyライブラリについて、その基本的な使い方から、階層構造の操作、データセットの読み書き、メタデータの管理まで、主要な機能を徹底的に解説しました。

h5pyをマスターすることは、GB/TBクラスのデータセットを扱うデータサイエンスや機械学習のプロジェクトにおいて、非常に強力な武器となります。メモリの制約に囚われず、高速かつ柔軟にデータを管理・処理できるようになるでしょう。

「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks