| この記事の要点 |
|
概要
Apache Arrow は「言語に依存しない列指向のインメモリ表現」を統一しようとする OSS プロジェクトで、2016 年に Apache 配下で発足した。Pandas(Python)、data.frame(R)、Spark、Dremio、Drill、DuckDB など、それぞれが内部にバラバラの列指向構造を持っていたのを、同じバイト並びに揃えることでゼロコピーの相互運用を可能にする狙いがある。
その Arrow のメモリ表現を、そのままディスクに書き出したものが Arrow IPC ファイル形式で、初期にはこれを Feather v1 として公開していた。2019 年に仕様を統合する形で Feather v2 = Arrow IPC File Format となり、現在は Feather と Arrow IPC は実質同じものを指す。拡張子は慣習的に .feather(Pandas/R 文化)、.arrow / .ipc(Arrow 公式)と使い分けられる程度。
位置づけとしては Parquet と似て非なるもので、Parquet が「ディスク上でできるだけ小さく、長期保管に適する」ように圧縮とエンコーディングを尽くすのに対し、Feather/Arrow IPC は「メモリ表現と同じバイト並びで、読み込みコストをゼロに近づける」設計になっている。結果として、ファイルサイズは Parquet より大きくなるが、読み込み速度は Parquet を上回ることが多い。
内部構造
Arrow IPC ファイルは Schema → RecordBatch (複数) → Footer という構造で、各 RecordBatch は Arrow のメモリ表現と完全一致するバイト列を持つ。スキーマと長さ情報は Flatbuffers でメタデータ化されており、Flatbuffers のゼロコピー特性により、ファイルを mmap してそのまま列配列として扱える。
- Schema: 列名・型・nullable 情報。Flatbuffers エンコード。
- RecordBatch: 行を一定数まとめた塊。列ごとに「Validity Bitmap(NULL ビット)」「Offsets(可変長型のオフセット配列)」「Values(実データ)」が並ぶ。
- Footer: 各 RecordBatch のオフセット、終端マーカ。
圧縮は LZ4 / ZSTD を選べるが、デフォルトは無圧縮である。Parquet のように Dictionary Encoding や RLE といった論理エンコーディングを内部で施さないのが思想的な違いで、これがゼロコピー読み込みを成立させている。
v1 Feather は仕様が古く、近年は v2 (Arrow IPC) のみが推奨される。Pandas で df.to_feather() すると自動的に v2 で書き出される。
主な用途
- Python ↔ R のデータ交換: Pandas で書いた
.featherを、R のarrow::read_feather()で 1 行で読める。CSV/JSON 経由より圧倒的に速くて型も保たれる。 - Jupyter Notebook での中間ファイル: 数百 MB の DataFrame をセル間や再起動を跨いで保持したいとき、pickle より互換性が高く読み込みが速い。
- 機械学習の前処理出力: 特徴量テーブルを学習プロセスに渡す。Parquet より起動が速いため、何度も読む小〜中規模データで強い。
- プロセス間共有(shared memory): Arrow IPC Stream 形式 + Plasma Store などで、複数プロセス間でゼロコピー共有。
- DuckDB / Polars との連携: 両者とも Arrow ネイティブなので、Feather/Arrow IPC をほぼ無コストで読める。
関連形式との比較
| 形式 | 戦略 | サイズ | 読み込み速度 | 得意 |
|---|---|---|---|---|
| Feather / Arrow IPC | メモリ表現直マッピング | 中〜大 | 非常に高速 | 言語間・プロセス間 I/O、中間ファイル |
| Parquet | 強圧縮・列指向 | 小 | 速い(変換あり) | 長期保管・大規模分析 |
| pickle | Python オブジェクト直列化 | 大 | 速い | Python 内のみ |
| CSV | テキスト・行指向 | 大 | 非常に遅い | 受け渡し |
Wes McKinney 自身が「Parquet は長期、Feather は短期」と整理しており、これがそのまま選定指針になる。1 ヶ月以上保管するなら Parquet(Parquet(.parquet) 参照)、明日のセッションで読み直すだけなら Feather、というイメージ。
コマンド・ツール
Pandas (Python) から。
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "v": [0.5]*1000000})
# 書き出し(自動的に Arrow IPC v2)
df.to_feather("data.feather")
# 読み込み
df2 = pd.read_feather("data.feather")
R から。
library(arrow)
df <- read_feather("data.feather")
write_feather(df, "out.feather")
pyarrow を直接使う場合は、RecordBatchFileWriter / RecordBatchFileReader でストリーミング処理も書ける。
import pyarrow as pa
import pyarrow.ipc as ipc
table = pa.table({"id": [1,2,3], "name": ["a","b","c"]})
with ipc.new_file("sample.arrow", table.schema) as w:
w.write_table(table)
with ipc.open_file("sample.arrow") as r:
print(r.read_all())
DuckDB からは SELECT * FROM 'data.feather' のようにそのまま SQL を投げられる。
注意点
- 圧縮していないとサイズが大きい: Parquet の感覚で長期保管に使うとディスクを食う。長期保管は Parquet、それ以外で Feather と棲み分けるのが基本。
- v1 と v2 の混在: 古い
.featherは v1 で、機能・互換が限られる。新規書き出しはすべて v2 (Arrow IPC) になる。 - 追記不可: 1 ファイル単発書き出しが基本。継続的に増えるログには向かない。
- OS/エンディアン依存ではないが、Arrow バージョン非互換はたまに起きる。長期保管に使うなら pyarrow のバージョンを記録しておく。
関連リンク
- 親: データベース・データ交換
- 概論: ファイル拡張子とは
- カテゴリ: データベース(カテゴリ)
- 関連する形式: Parquet(.parquet) / Avro(.avro) / ORC(.orc) / Protocol Buffers(.proto)
- テキスト系比較: CSV(.csv)
子ページはありません
- SQL ダンプ(.sql)
- SQLite(.sqlite / .sqlite3 / .db)
- Parquet(.parquet)
- Avro(.avro)
- ORC(.orc)
- NDJSON / JSONL(.ndjson / .jsonl)
- BSON(.bson)
- Protocol Buffers(.proto)
- Feather / Arrow IPC(.feather / .ipc / .arrow)
- DB ダンプ(.dump / .bak)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15