doctrine-batch-processing について
メモリ使用量を抑えながら大規模データを処理する、Symfony 向けの Doctrine スキルです。ストリーミングや ID ベースの読み取り、定期的な flush と clear、書き込みに使う ORM、DQL、DBAL の選択を扱います。
主な機能
- 01toIterable() によるストリーミング読み取り
- 02大規模テーブルの ID ベースのページング
- 03バッチごとの flush と clear
- 04書き込みに使う ORM、DQL、DBAL の選択
- 05メモリ使用量と再開可能な進捗の記録
活用シーン
- 01メモリに収まらないデータのインポートやエクスポート
- 02コマンドやワーカーのメモリ枯渇の防止
- 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 を通じて大量のデータを挿入する場合。
デフォルトのワークフロー
- データセットのサイズとプロセスのメモリ予算を測定します。
toIterable()で読み取りをストリーミングするか、非常に大きなテーブルでは ID でページネーションします(id > :lastId)。- N 件ごとに
flush()とclear()を実行し、clear()の後に必要なデータは再取得します。 - ハイドレーションが不要な一括書き込みには、DQL の
UPDATE/DELETEまたは DBAL を使用します。 - メモリ使用量と進捗を記録し、処理を再開可能にします。
ガードレール
- 増加し続けるテーブルに対して
findAll()を使用しないでください。 clear()の前に読み込まれたエンティティはデタッチされます。変更したり永続化したりしないでください。- 一括 DQL と DBAL ではライフサイクルイベントとリスナーがスキップされます。それらに依存する処理がないか確認してください。
- ORM 3 では
Query#iterate()とsetSQLLogger()は廃止されています。toIterable()とロギングミドルウェアを使用してください。 - オフセットではなく ID でページネーションしてください。データが移動するとオフセットは遅くなり、行がスキップされるためです。
段階的な情報開示
- 実行方針とリスク管理にはこのファイルを使用します。
- 実装の詳細が必要な場合は、リファレンスを開きます。
出力要件
- バッチサイズと
clear()の実行箇所が明示されたバッチループ。 - 各書き込みに ORM、一括 DQL、DBAL のどれを選ぶかと、その理由。
- 現実的なデータ量での実行前後のメモリ測定値。
リファレンス
reference.md
コメント
Markdown 対応