关于 doctrine-batch-processing
面向 Symfony 的 Doctrine 批处理技能,帮助在控制内存使用的同时处理大型数据集。内容涵盖流式或按 ID 读取、定期 flush 和 clear,以及为写入选择 ORM、DQL 或 DBAL。
主要功能
- 01使用 toIterable() 流式读取
- 02按 ID 分页读取大型表
- 03分批执行 flush 和 clear
- 04为写入选择 ORM、DQL 或 DBAL
- 05跟踪内存与可恢复的处理进度
适用场景
- 01导入或导出超出内存容量的数据集
- 02避免命令或 Worker 内存耗尽
- 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(),并在清除后重新获取所需内容。 - 对于无需实体水合的批量写入,使用 DQL
UPDATE/DELETE或 DBAL。 - 记录内存使用量和进度,并确保任务可以恢复执行。
防护措施
- 对不断增长的表,绝不要使用
findAll()。 clear()之前加载的实体会变为脱管状态:不要修改或持久化它们。- 批量 DQL 和 DBAL 会跳过生命周期事件和监听器。检查是否有逻辑依赖这些机制。
- 在 ORM 3 中,
Query#iterate()和setSQLLogger()已移除:请使用toIterable()和日志中间件。 - 按 id 而非 offset 分页:offset 会越来越慢,而且数据变动时可能跳过行。
渐进式披露
- 使用此文件了解执行方式和风险控制。
- 需要深入了解实现细节时,请打开参考资料。
输出要求
- 包含明确批次大小和清除节点的批处理循环。
- 说明每种写入选择 ORM、DQL 批量操作还是 DBAL,并给出理由。
- 在真实数据量下测量并比较执行前后的内存使用量。
参考资料
reference.md
评论
支持 Markdown