mcpField
D
doctrine-batch-processing

doctrine-batch-processing

github.com/dev-toolingsデータ・データベース22788 回インストール3 週間前に更新
リポジトリ

doctrine-batch-processing について

メモリ使用量を抑えながら大規模データを処理する、Symfony 向けの Doctrine スキルです。ストリーミングや ID ベースの読み取り、定期的な flush と clear、書き込みに使う ORM、DQL、DBAL の選択を扱います。

主な機能

  1. 01toIterable() によるストリーミング読み取り
  2. 02大規模テーブルの ID ベースのページング
  3. 03バッチごとの flush と clear
  4. 04書き込みに使う ORM、DQL、DBAL の選択
  5. 05メモリ使用量と再開可能な進捗の記録

活用シーン

  1. 01メモリに収まらないデータのインポートやエクスポート
  2. 02コマンドやワーカーのメモリ枯渇の防止
  3. 03データの一括更新、削除、挿入

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dev-toolings/superpowers-symfony --skill doctrine-batch-processing

インストール後、Claude Code で/doctrine-batch-processingを入力して読み込まれたか確認します。

同梱ファイルreference.md

詳細

Doctrine のバッチ処理(Symfony)

使用する場面

  • インポート、エクスポート、バックフィルなど、メモリに収まる量を超える行を処理する場合。
  • エンティティを反復処理するコマンドやワーカーでメモリ不足が発生する場合。
  • 多数の行を一度に更新または削除する場合。
  • Doctrine または DBAL を通じて大量のデータを挿入する場合。

デフォルトのワークフロー

  1. データセットのサイズとプロセスのメモリ予算を測定します。
  2. toIterable() で読み取りをストリーミングするか、非常に大きなテーブルでは ID でページネーションします(id > :lastId)。
  3. N 件ごとに flush() と clear() を実行し、clear() の後に必要なデータは再取得します。
  4. ハイドレーションが不要な一括書き込みには、DQL の UPDATE/DELETE または DBAL を使用します。
  5. メモリ使用量と進捗を記録し、処理を再開可能にします。

ガードレール

  • 増加し続けるテーブルに対して findAll() を使用しないでください。
  • clear() の前に読み込まれたエンティティはデタッチされます。変更したり永続化したりしないでください。
  • 一括 DQL と DBAL ではライフサイクルイベントとリスナーがスキップされます。それらに依存する処理がないか確認してください。
  • ORM 3 では Query#iterate() と setSQLLogger() は廃止されています。toIterable() とロギングミドルウェアを使用してください。
  • オフセットではなく ID でページネーションしてください。データが移動するとオフセットは遅くなり、行がスキップされるためです。

段階的な情報開示

  • 実行方針とリスク管理にはこのファイルを使用します。
  • 実装の詳細が必要な場合は、リファレンスを開きます。

出力要件

  • バッチサイズと clear() の実行箇所が明示されたバッチループ。
  • 各書き込みに ORM、一括 DQL、DBAL のどれを選ぶかと、その理由。
  • 現実的なデータ量での実行前後のメモリ測定値。

リファレンス

  • reference.md

コメント