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中心

パフォーマンス比較

ファイルサイズ

一般的な圧縮効率の順序:

  1. Parquet – 列指向の特性により最高の圧縮率
  2. Zarr – チャンク単位の圧縮で高い効率
  3. 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爆速講座