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. 01使用 toIterable() 流式读取
  2. 02按 ID 分页读取大型表
  3. 03分批执行 flush 和 clear
  4. 04为写入选择 ORM、DQL 或 DBAL
  5. 05跟踪内存与可恢复的处理进度

适用场景

  1. 01导入或导出超出内存容量的数据集
  2. 02避免命令或 Worker 内存耗尽
  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(),并在清除后重新获取所需内容。
  4. 对于无需实体水合的批量写入,使用 DQL UPDATE/DELETE 或 DBAL。
  5. 记录内存使用量和进度,并确保任务可以恢复执行。

防护措施

  • 对不断增长的表,绝不要使用 findAll()。
  • clear() 之前加载的实体会变为脱管状态:不要修改或持久化它们。
  • 批量 DQL 和 DBAL 会跳过生命周期事件和监听器。检查是否有逻辑依赖这些机制。
  • 在 ORM 3 中,Query#iterate() 和 setSQLLogger() 已移除:请使用 toIterable() 和日志中间件。
  • 按 id 而非 offset 分页:offset 会越来越慢,而且数据变动时可能跳过行。

渐进式披露

  • 使用此文件了解执行方式和风险控制。
  • 需要深入了解实现细节时,请打开参考资料。

输出要求

  • 包含明确批次大小和清除节点的批处理循环。
  • 说明每种写入选择 ORM、DQL 批量操作还是 DBAL,并给出理由。
  • 在真实数据量下测量并比较执行前后的内存使用量。

参考资料

  • reference.md

评论

支持 Markdown