h5py 徹底解説: 大規模データを超高速に扱うHDF5とPythonの連携!
![]() |
20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード |
| |
週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ |
| |
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で簡単にインストールできます。
pip install h5py
2. インポート
Pythonスクリプトでh5pyを使用する際は、通常以下のようにインポートします。
import h5py
import numpy as np
h5pyの基本的な使い方と機能一覧
1. HDF5ファイルの作成とオープン
h5py.File()を使ってHDF5ファイルを作成または既存のファイルを開きます。
mode引数でファイルの操作モードを指定します。
-
'w'(write): 新規作成。既存のファイルがあれば上書き。 -
'w-'(write, fail if exists): 新規作成。既存のファイルがあればエラー。 -
'a'(append): 既存のファイルを開き、追記モード。ファイルがなければ新規作成。 -
'r'(read): 読み込み専用。
# ファイルの作成 (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配列などを書き込みます。
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配列のように扱えます。
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()メソッドでグループを作成し、ファイルシステムのようにデータを整理できます。
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属性を使ってメタデータを追加できます。これはデータの付随情報として非常に役立ちます。
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. 既存データの参照と削除
ファイル内のオブジェクトをリスト表示したり、削除したりすることも可能です。
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スカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード |
| |
週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ |
| |
10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks |


