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