【问题标题】:doctrine 2.1: memory usage increased after flush学说 2.1:刷新后内存使用量增加
【发布时间】:2012-03-17 16:08:19
【问题描述】:
这对我来说真的很不直观,为什么在 flush() 之后内存会增加而不是减少?我在文档中找不到任何有用的东西。我每 50 次循环迭代刷新一次,每次刷新内存使用量增加 1MB。 100 次刷新使用 100MB !我在这里想念什么?我在教义的网站示例中看到了 clear(),但是如果我使用它,我会遇到一个异常,即我的一个对象没有级联持久集。谁能解释我在幕后做了什么,我应该怎么做才能正确取消所有教义的对象?
【问题讨论】:
标签:
php
memory-management
orm
memory-leaks
doctrine
【解决方案2】:
问题是,实体管理器处理所有对象。如果您在每次 X 次迭代后不需要 ram 中的对象,则应该重置它。试试这个:
// get the entity manager and save objects and flush
$em = $this->get('doctrine')->getEntityManager();
...
$em->flush();
// then reset the entity manager
$this->get('doctrine')->resetEntityManager();
【解决方案3】:
我在批量插入记录(超过 100K)时遇到了类似的情况。我遵循了 Rauni 和 Besnik 的建议以及 Doctrine 的批处理指南,但即使在 $em->clear() 和 resetEntityManager() 之后内存仍然增长。几天后,我在 Doctrine 的文档上发布了信息通知:
ORM 工具主要不适用于大量插入、更新或
删除。每个 RDBMS 都有自己最有效的处理方式
此类操作以及如果下面概述的选项不够
出于您的目的,我们建议您使用适合您特定的工具
用于这些批量操作的 RDBMS。
并使用原始 SQL (MySQL) 并批量插入。内存使用量从 Doctrine 的 200MB 以上下降到原始 SQL 的 30MB。当我从源数组中弹出要插入的元素时,我可以看到内存使用量减少了。也快得多,从 220 秒缩短到 20 秒。