mcpField
I
io-bound-data-processing

io-bound-data-processing

github.com/pproencaデータ・データベース218121 回インストール11 週間前に更新
リポジトリ

io-bound-data-processing について

メモリ容量を超えるデータを単一の小規模マシンで処理するエンジニア向けのスキルです。メモリ管理、I/O、形式、バッチ処理、ディスクへの退避、バックプレッシャー、並行処理、測定を実行への影響順に扱います。

主な機能

  1. 01ストリーミングとメモリ使用量の制限
  2. 02逐次・バッファ付きI/Oパターン
  3. 03形式とエンコーディングの選択
  4. 04チャンク化、バッチ処理、ディスク退避
  5. 05バックプレッシャーと並行処理の指針
  6. 06スループットとボトルネックの測定

活用シーン

  1. 01メモリを超えるデータ処理でのOOM防止
  2. 02遅いファイル・ネットワーク処理の高速化
  3. 03メモリ予算に応じたチャンクサイズの選定
  4. 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.md
metadata.json
assets/templates/
_template.md
references/
_sections.md
batch-coalesce-writes-with-buffered-output.md
batch-keyset-pagination-over-offset.md
batch-pick-chunk-size-by-memory-budget.md
batch-process-with-stable-iterators.md
batch-use-vectorized-apis-not-row-loops.md
codec-dictionary-encoding-for-repetitive-strings.md
codec-prefer-binary-protocols-over-json-for-rpc.md
codec-train-a-zstd-dictionary-for-many-small-payloads.md
codec-zstd-or-lz4-as-defaults-not-gzip.md
conc-asyncio-for-many-network-streams-not-for-cpu.md
conc-overlap-compute-with-prefetch.md
conc-thread-pools-for-blocking-io-libraries.md
conc-tune-parallelism-to-the-bottleneck.md
fmt-avoid-deeply-nested-json-for-hot-paths.md
fmt-columnar-for-analytical-scans.md
fmt-line-delimited-for-streaming-row-ingest.md
fmt-prefer-schema-on-write-when-possible.md
fmt-push-predicates-into-the-reader.md
io-async-for-many-concurrent-streams.md
io-batch-and-pipeline-network-roundtrips.md
io-buffer-explicitly-for-small-records.md
io-mmap-for-random-or-shared-large-files.md
io-prefer-sequential-over-random.md
io-stream-http-bodies-with-iter-content.md
io-zero-copy-when-moving-bytes-as-is.md
mem-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 にすべて読み込むと、制約のあるマシンでは以降のあらゆる手法が無意味になります
2I/O アクセスパターンio-重大ディスク/ネットワークは RAM より 10³~10⁶ 倍遅く、アクセスパターンが実行時間を左右します
3データフォーマットとエンコーディングfmt-高フォーマットによって、ロジックを実行する前に I/O 量とデコードコストの下限が決まります
4チャンク化とバッチ処理batch-高粒度によってピークメモリが決まり、項目ごとのオーバーヘッドが分散されます
5ディスクへのスピルと外部メモリspill-高データが RAM を超える場合、「適切にスピルする」か「OOM」かの選択になります
6パイプライン処理とバックプレッシャーpipe-中~高高速なプロデューサーと低速なシンクの間に上限のないバッファーがあると、OOM が発生します
7圧縮とシリアライズcodec-中CPU と I/O をトレードオフします。適切なコーデックを選ぶと桁違いに効率が向上します
8I/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)
3. データ形式とエンコーディング(HIGH)
4. チャンク化とバッチ処理(HIGH)
5. ディスクへのスピルと外部メモリ(HIGH)
6. パイプライン処理とバックプレッシャー(MEDIUM-HIGH)
7. 圧縮とシリアライズ(MEDIUM)
8. I/O バウンドなワークロード向けの並行処理(MEDIUM)
9. 可観測性とスループットの調整(LOW-MEDIUM)

使い方

まず、問題に当てはまる質問を探します。

  • 「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 — このスキルの基盤となるアルゴリズムの基本要素(外部マージソート、スケッチ、ハッシュパーティショニング、サンプリング)

コメント