HDF5 vs Parquet vs Zarr:科学データとビッグデータに最適なファイル形式の選び方
データサイエンスや科学計算の分野では、大量のデータを効率的に保存・読み込みできるファイル形式の選択が重要です。本記事では、代表的な3つのデータ形式(HDF5、Parquet、Zarr)の特徴を詳しく比較し、用途に応じた最適な選択方法を解説します。
HDF5、Parquet、Zarrとは?
HDF5(Hierarchical Data Format 5)
HDF5は科学技術計算分野で広く使用される階層構造データ形式です。1998年にリリースされ、NASA、NOAA、欧州宇宙機関などの研究機関で標準的に使用されています。
Parquet
Parquetは列指向ストレージ形式で、Apache財団によって開発されました。ビッグデータ処理において高い圧縮率と高速なクエリ性能を実現します。
Zarr
Zarrは科学計算向けの比較的新しいデータ形式で、チャンクベースの配列ストレージとクラウドストレージとの親和性が特徴です。
機能比較表
| 項目 | HDF5 | Parquet | Zarr |
|---|---|---|---|
| データ構造 | 階層構造(グループ/データセット) | 列指向テーブル | 多次元配列 |
| 圧縮 | gzip、szip、LZO等 | Snappy、GZIP、LZ4等 | Blosc、GZIP、LZ4等 |
| 並列アクセス | 限定的サポート | 優秀 | 優秀 |
| クラウド対応 | 限定的 | 優秀(S3等) | 優秀(S3、GCS等) |
| メタデータ | 豊富な属性サポート | スキーマ情報 | 配列メタデータ |
| 言語サポート | C、Python、R、Java等 | 多言語対応 | Python中心 |
パフォーマンス比較
ファイルサイズ
一般的な圧縮効率の順序:
- Parquet – 列指向の特性により最高の圧縮率
- Zarr – チャンク単位の圧縮で高い効率
- HDF5 – 設定次第で高い圧縮率を実現
読み込み速度
用途によって異なりますが、一般的な傾向:
- 列選択クエリ: Parquet > Zarr > HDF5
- 配列全体の読み込み: Zarr > HDF5 > Parquet
- ランダムアクセス: HDF5 > Zarr > Parquet
各形式のサンプルコード
HDF5の基本操作
import h5py
import numpy as np
# 書き込み
with h5py.File('data.h5', 'w') as f:
f.create_dataset('array', data=np.random.random((1000, 100)))
# 読み込み
with h5py.File('data.h5', 'r') as f:
data = f['array'][:]
Parquetの基本操作
import pandas as pd
import pyarrow.parquet as pq
# 書き込み
df = pd.DataFrame({'col1': range(1000), 'col2': np.random.random(1000)})
df.to_parquet('data.parquet')
# 読み込み
df = pd.read_parquet('data.parquet')
Zarrの基本操作
import zarr
import numpy as np
# 書き込み
z = zarr.open('data.zarr', mode='w', shape=(1000, 100), chunks=(100, 100))
z[:] = np.random.random((1000, 100))
# 読み込み
z = zarr.open('data.zarr', mode='r')
data = z[:]
用途別おすすめ形式
HDF5が適している場面
- 科学計算・研究データ: 複雑な階層構造が必要な場合
- リアルタイム計測データ: 継続的なデータ追記が必要な場合
- レガシーシステム: 既存のHDF5インフラがある場合
# HDF5での階層構造の例
with h5py.File('experiment.h5', 'w') as f:
exp1 = f.create_group('experiment_1')
exp1.create_dataset('temperature', data=temp_data)
exp1.create_dataset('pressure', data=pressure_data)
Parquetが適している場面
- ビッグデータ分析: 大規模なテーブルデータの分析
- データウェアハウス: 列指向クエリが多い場合
- クラウド分析: Spark、Dask等との連携
# Parquetでの効率的な列選択
df = pd.read_parquet('large_data.parquet', columns=['col1', 'col3'])
Zarrが適している場面
- 大規模配列データ: 気象データ、衛星画像等
- クラウドネイティブ: S3やGCS上での直接処理
- 分散計算: Daskとの組み合わせ
# Zarrでのクラウドストレージアクセス
import s3fs
store = s3fs.S3FileSystem().get_mapper('s3://bucket/data.zarr')
z = zarr.open(store, mode='r')
クラウド環境での活用
AWS S3での使用例
# Parquet on S3
df = pd.read_parquet('s3://bucket/data.parquet')
# Zarr on S3
import s3fs
fs = s3fs.S3FileSystem()
store = s3fs.S3Map('s3://bucket/data.zarr', s3=fs)
z = zarr.open(store)
分散処理との連携
# DaskでのParquet処理
import dask.dataframe as dd
df = dd.read_parquet('s3://bucket/*.parquet')
# DaskでのZarr処理
import dask.array as da
arr = da.from_zarr('s3://bucket/data.zarr')
まとめ:形式選択の指針
データ形式の選択は、以下の要因を総合的に考慮して決定しましょう:
HDF5を選ぶべき場合
- 階層構造のメタデータが重要
- 既存のHDF5エコシステムとの互換性が必要
- リアルタイムでのデータ追記が頻繁
Parquetを選ぶべき場合
- 列指向のクエリが中心
- 最高の圧縮率が必要
- ビッグデータエコシステム(Spark等)との連携
Zarrを選ぶべき場合
- 大規模な多次元配列データ
- クラウドストレージでの直接処理
- 分散計算環境での並列アクセス
適切なデータ形式の選択により、ストレージコストの削減、処理速度の向上、システムの拡張性確保が実現できます。プロジェクトの要件を詳細に分析し、最適な形式を選択することが成功の鍵となります。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

