学说2.1:刷新后内存使用量增加

时间:2012-03-17 16:08:20

标签: php memory-management orm memory-leaks doctrine

对我来说真的不直观,为什么在flush()之后内存增加而不是减少?我在文档中找不到任何有用的东西。我正在刷新每50次循环迭代,每次刷新内存使用量增加1MB。 100次冲洗使用100MB!我在这里错过了什么?我在doctrine的网站上看到了带有clear()的例子,但如果我使用它,我得到一个异常,我的一个对象没有cascade persist set。任何人都可以解释我在幕后做了什么,我该怎么做才能正确地取消所有学说的对象?

3 个答案:

答案 0 :(得分:4)

问题是,实体管理器处理所有对象。如果在每次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();

答案 1 :(得分:4)

另请阅读此处:http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html

它建议在每次操作后使用$ em-> clear()。 (这应该与Besnik建议的效果相同)。

从前面提到的链接:

  

Doctrine中的批量插入最好分批进行   一个事务性的后写行为的优点   EntityManager的。以下代码显示了插入10000的示例   批量大小为20的对象。您可能需要尝试使用   批量大小,以找到最适合您的大小。批量较大   大小意味着内部更准备的语句重用,但也意味着更多   在冲洗期间工作。

答案 2 :(得分:0)

我有大量插入记录(超过100K)的类似情况。我遵循了Rauni和Besnik的建议和Doctrine的批量指南,但是在$ em-> clear()和resetEntityManager()之后,内存仍然增长。几天后,我在Doctrine的文档上发布了信息通知:

  

ORM工具主要不适合大规模插入,更新或   删除。每个RDBMS都有自己最有效的处理方式   此类操作,如果下面列出的选项不充分   为了您的目的,我们建议您使用适合您的特定工具   这些批量操作的RDBMS。

并使用原始SQL(MySQL)并批量插入。使用原始SQL,内存使用量从Doctrine下降到200MB以上。当我弹出要插入源数组的元素时,我可以看到内存使用量减少了。也快得多,从220秒到20秒。