io-bound-data-processing について
メモリ容量を超えるデータを単一の小規模マシンで処理するエンジニア向けのスキルです。メモリ管理、I/O、形式、バッチ処理、ディスクへの退避、バックプレッシャー、並行処理、測定を実行への影響順に扱います。
主な機能
- 01ストリーミングとメモリ使用量の制限
- 02逐次・バッファ付きI/Oパターン
- 03形式とエンコーディングの選択
- 04チャンク化、バッチ処理、ディスク退避
- 05バックプレッシャーと並行処理の指針
- 06スループットとボトルネックの測定
活用シーン
- 01メモリを超えるデータ処理でのOOM防止
- 02遅いファイル・ネットワーク処理の高速化
- 03メモリ予算に応じたチャンクサイズの選定
- 04小規模マシンでのI/Oボトルネック診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill io-bound-data-processingインストール後、Claude Code で/io-bound-data-processingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdbatch-coalesce-writes-with-buffered-output.mdbatch-keyset-pagination-over-offset.mdbatch-pick-chunk-size-by-memory-budget.mdbatch-process-with-stable-iterators.mdbatch-use-vectorized-apis-not-row-loops.mdcodec-dictionary-encoding-for-repetitive-strings.mdcodec-prefer-binary-protocols-over-json-for-rpc.mdcodec-train-a-zstd-dictionary-for-many-small-payloads.mdcodec-zstd-or-lz4-as-defaults-not-gzip.mdconc-asyncio-for-many-network-streams-not-for-cpu.mdconc-overlap-compute-with-prefetch.mdconc-thread-pools-for-blocking-io-libraries.mdconc-tune-parallelism-to-the-bottleneck.mdfmt-avoid-deeply-nested-json-for-hot-paths.mdfmt-columnar-for-analytical-scans.mdfmt-line-delimited-for-streaming-row-ingest.mdfmt-prefer-schema-on-write-when-possible.mdfmt-push-predicates-into-the-reader.mdio-async-for-many-concurrent-streams.mdio-batch-and-pipeline-network-roundtrips.mdio-buffer-explicitly-for-small-records.mdio-mmap-for-random-or-shared-large-files.mdio-prefer-sequential-over-random.mdio-stream-http-bodies-with-iter-content.mdio-zero-copy-when-moving-bytes-as-is.mdmem-bound-the-working-set.md詳細
制約のあるリソースでのコミュニティ I/O バウンドデータ処理のベストプラクティス
RAM を超えるデータセットを、計算能力の低い単一マシンで処理するエンジニア向けのリファレンスです。実行ライフサイクルへの影響度順にまとめています。表の上部にあるルールは、ジョブがそもそも実行できるかどうかを左右し、下部のルールは最後の 10%を改善します。上から順に最適化してください。
対象範囲: ノートパソコン、2 vCPU のコンテナ、または Raspberry Pi クラスのノードで行う、実際の ETL/データエンジニアリング/バッチ処理で見られるパターンです。ストリーミング、フォーマット、チャンク化、スピル、バックプレッシャー、コーデック、および I/O バウンドのボトルネックに実際に適合する並行処理モデルを扱います。対象外(別途扱われています):アルゴリズムの基本要素そのもの(computer-science-algorithmsを参照)、単一マシンを超える分散コンピューティング(Spark/Dask を使用)、データベースエンジンの内部実装(公式ドキュメントを参照)。
Apache Arrow / Parquet のドキュメント、Polars User Guide、DuckDB のドキュメント、pandas — 大規模データセットへのスケーリング、Linux の man ページ(mmap(2)、sendfile(2)、posix_fadvise(2))、Brendan Gregg の USE メソッドと『Systems Performance』、Kleppmann の『Designing Data-Intensive Applications』、および zstd/lz4 のリファレンスベンチマークから要点をまとめています。
適用するタイミング
次のような場合に、これらのルールを参照してください。
- 小規模なマシンでジョブが OOM キルされたり、スワップが発生したり、予想より大幅に遅くなったりする
- 入力が RAM よりも大きく、スキャン、フィルタリング、集計、ソート、結合が必要である
- パイプラインの各段階の間に上限のないバッファーがある、または「ストリーミング」ジョブ中にメモリ使用量が線形に増加する
- 行ごとに RTT が発生する書き込みがある(行ごとの
INSERT、URL ごとのrequests.get、レコードごとのf.read(32)) - フォーマット/コーデック/シリアライザーを選定しており、その選択が大規模な処理に影響する
topで CPU 使用率が低く iowait が高い、またはどちらが原因かわからない- 「遅いけれど原因がわからない」—まず obs- カテゴリから確認してください
優先度別のルールカテゴリ
| # | カテゴリ | プレフィックス | 影響度 | 連鎖的に影響する理由 |
|---|---|---|---|---|
| 1 | メモリの適切な管理 | mem- | 重大 | RAM にすべて読み込むと、制約のあるマシンでは以降のあらゆる手法が無意味になります |
| 2 | I/O アクセスパターン | io- | 重大 | ディスク/ネットワークは RAM より 10³~10⁶ 倍遅く、アクセスパターンが実行時間を左右します |
| 3 | データフォーマットとエンコーディング | fmt- | 高 | フォーマットによって、ロジックを実行する前に I/O 量とデコードコストの下限が決まります |
| 4 | チャンク化とバッチ処理 | batch- | 高 | 粒度によってピークメモリが決まり、項目ごとのオーバーヘッドが分散されます |
| 5 | ディスクへのスピルと外部メモリ | spill- | 高 | データが RAM を超える場合、「適切にスピルする」か「OOM」かの選択になります |
| 6 | パイプライン処理とバックプレッシャー | pipe- | 中~高 | 高速なプロデューサーと低速なシンクの間に上限のないバッファーがあると、OOM が発生します |
| 7 | 圧縮とシリアライズ | codec- | 中 | CPU と I/O をトレードオフします。適切なコーデックを選ぶと桁違いに効率が向上します |
| 8 | I/O バウンドのワークロードにおける並行処理 | conc- | 中 | 非同期処理/スレッド/プロセスはそれぞれ異なる手段です。誤ったモデルを選ぶと CPU を無駄にします |
| 9 | 可観測性とスループットのチューニング | obs- | 低~中 | 測定できないものは調整できません。iowait は CPU バウンドを意味しません |
クイックリファレンス
1. メモリ管理(CRITICAL)
mem-stream-dont-slurp— ソースをチャンクごとに反復処理します。ピーク時の RAM 使用量はファイルサイズではなく、チャンクサイズで決まりますmem-prefer-generators-over-lists-for-pipelines— ジェネレーターはデータを流し、リストはすべてをメモリ上に展開しますmem-shrink-dtypes-before-loading— 整数型を小さくし、カテゴリ型を使用すると、読み込み時のメモリ使用量を 2~8 倍削減できますmem-use-views-not-copies— コピーせずにスライスします。NumPy/Arrow のゼロコピーセマンティクスを活用しますmem-bound-the-working-set— チャンクサイズは切りのよい数値ではなく、「予算 ÷ 行サイズ × 増幅率」で算出しますmem-release-references-explicitly— 中間データを破棄し、ピーク使用量が N × チャンクにならないようにします
2. I/O アクセスパターン(CRITICAL)
io-prefer-sequential-over-random— オフセットをソートし、カーネルにヒントを与えて、先読みの効果を活用しますio-buffer-explicitly-for-small-records—BufferedReaderを使うと、システムコールを 1000 分の 1 に減らせますio-stream-http-bodies-with-iter-content—.contentではなく、stream=Trueとiter_contentを使いますio-mmap-for-random-or-shared-large-files— ランダムアクセスには、ゼロコピーとオンデマンドページングを使用しますio-async-for-many-concurrent-streams— 1 つのスレッドで数千の await を処理しますio-batch-and-pipeline-network-roundtrips—COPY、パイプライン、複数キー対応エンドポイント、HTTP/2 を活用しますio-zero-copy-when-moving-bytes-as-is—sendfile、copy_file_range、shutil.copyfileを使います
3. データ形式とエンコーディング(HIGH)
fmt-columnar-for-analytical-scans— フィルターと列選択を伴う処理には Parquet/Arrow を使いますfmt-line-delimited-for-streaming-row-ingest— ストリーミングには JSON 配列ではなく NDJSON を使いますfmt-push-predicates-into-the-reader— 行グループの統計情報を使ってチャンク全体をスキップしますfmt-prefer-schema-on-write-when-possible— 可能な場合はスキーマオンリードよりスキーマオンライトを優先します。型付き列は常にスキーマオンリードに勝りますfmt-avoid-deeply-nested-json-for-hot-paths— ホットパスにはフラットなスキーマを使うか、バイナリ形式を使います
4. チャンク化とバッチ処理(HIGH)
batch-pick-chunk-size-by-memory-budget— 固定値ではなく、メモリ予算から算出しますbatch-use-vectorized-apis-not-row-loops—iterrowsではなく、NumPy/Polars/Arrow のカーネルを使いますbatch-process-with-stable-iterators—iter_batches、chunksize=、collect(streaming=True)を使いますbatch-coalesce-writes-with-buffered-output—COPY/executemanyと、サイズを指定した書き込みバッファーを使いますbatch-keyset-pagination-over-offset—WHERE id > $last_idを使い、深いカーソルでOFFSET Nは決して使いません
5. ディスクへのスピルと外部メモリ(HIGH)
spill-external-merge-sort-when-data-exceeds-ram— メモリに収まらないデータのソート。可能であればsort/ DuckDB に委譲しますspill-partition-by-hash-for-out-of-core-groupby-join— 両側をハッシュでパーティション分割し、パーティションごとに処理しますspill-use-temp-files-not-process-memory—SpooledTemporaryFileを使い、無制限のBytesIOは使いませんspill-use-engines-that-spill-automatically— DuckDB / Polars / Dask にスピルを任せます
6. パイプライン処理とバックプレッシャー(MEDIUM-HIGH)
pipe-use-bounded-queues-for-producer-consumer— 有界Queueがバックプレッシャーの仕組みになりますpipe-apply-backpressure-from-slow-stages— 遅いシンクが高速なソースを抑制しますpipe-prefer-pull-iteration-over-push-callbacks— プル方式は自然にバックプレッシャーがかかります。プッシュ方式ではポリシーが必要ですpipe-checkpoint-progress-for-resumability— 各バッチの後にアトミックなチェックポイントを作成し、やり直しを限定します
7. 圧縮とシリアライズ(MEDIUM)
codec-zstd-or-lz4-as-defaults-not-gzip— アクセスパターンに応じてコーデックを選びます。gzip はレガシーですcodec-dictionary-encoding-for-repetitive-strings— カーディナリティの低い列で 5~50 倍の効果がありますcodec-prefer-binary-protocols-over-json-for-rpc— 頻繁にデータが流れる箇所では Protobuf / Arrow IPC / MsgPack を使いますcodec-train-a-zstd-dictionary-for-many-small-payloads— 1 KB 未満のメッセージにはzstd --trainを使います
8. I/O バウンドなワークロード向けの並行処理(MEDIUM)
conc-asyncio-for-many-network-streams-not-for-cpu— Asyncio は待機を多重化しますが、計算には役立ちませんconc-thread-pools-for-blocking-io-libraries— ブロッキング I/O 中は GIL が解放されるため、スレッドが有効ですconc-overlap-compute-with-prefetch— バックグラウンドスレッド / コルーチンで 1 バッチ先行させますconc-tune-parallelism-to-the-bottleneck— ワーカー数をボトルネックとなるリソースに合わせます
9. 可観測性とスループットの調整(LOW-MEDIUM)
obs-measure-iowait-not-just-cpu—iostat -x、vmstat、psutil で実際のボトルネックを見つけますobs-instrument-throughput-rows-per-second— 処理率を使えば実行ごとの比較が可能になり、性能低下を検出できますobs-profile-with-py-spy-or-strace-for-syscall-storms— 推測せず、アタッチして調査します
使い方
まず、問題に当てはまる質問を探します。
- 「OOM が発生する/ストリーミングジョブ中に RAM 使用量が直線的に増える」 →
mem-とpipe-(バッファーが無制限に増えているか、反復ごとに蓄積している可能性があります) - 「CPU はアイドル状態なのに、ディスク使用率が 100 % になっている」 →
io-(ランダムアクセス、バッファーなしの I/O、または不適切な形式が原因の可能性があります) - 「この 10 GB のファイルを読み込むのに、なぜこんなに時間がかかるのか?」 →
fmt-columnar-for-analytical-scansとio-buffer-explicitly-for-small-recordsから始めます - 「チャンクのサイズはどれくらいがよいか?」 →
batch-pick-chunk-size-by-memory-budget - 「データが RAM に収まらない」 →
spill-(自動でスピルするエンジンを優先してください:spill-use-engines-that-spill-automatically) - 「ネットワーク呼び出しが大量にある」 →
io-batch-and-pipeline-network-roundtrips、io-async-for-many-concurrent-streams - 「ワーカーを追加しても改善しなかった」 →
conc-tune-parallelism-to-the-bottleneck、obs-measure-iowait-not-just-cpu - 「処理が遅いが、原因がわからない」 → まず
obs-を確認します。何かを変更する前にプロファイリングしてください
コード例には Python を使用しています(幅広い読者にとって最も読みやすいためです)。考え方はほかのエコシステムにも当てはまります。ほかのエコシステムの同等のライブラリ(Arrow C++/Rust/Java、Polars Rust、あらゆる環境の DuckDB、libuv 形式の非同期処理)も同じパターンに従います。
リファレンスファイル
| ファイル | 説明 |
|---|---|
| references/_sections.md | カテゴリーの定義と順序 |
| assets/templates/_template.md | 新しいルールを追加するためのテンプレート |
| metadata.json | バージョンとリファレンス情報 |
| AGENTS.md | 自動生成された目次ナビゲーション |
関連スキル
computer-science-algorithms— このスキルの基盤となるアルゴリズムの基本要素(外部マージソート、スケッチ、ハッシュパーティショニング、サンプリング)