Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则2.1:刷新后内存使用增加_Php_Memory Management_Orm_Memory Leaks_Doctrine - Fatal编程技术网

Php 原则2.1:刷新后内存使用增加

Php 原则2.1:刷新后内存使用增加,php,memory-management,orm,memory-leaks,doctrine,Php,Memory Management,Orm,Memory Leaks,Doctrine,为什么在flush()之后内存会增加而不是减少,这对我来说真的很不直观?我在文档中找不到任何有用的东西。我每50次循环迭代刷新一次,每次刷新后内存使用量增加1MB。100刷新使用100MB!我错过了什么?我在doctrine的网站上看到了clear()的例子,但如果我使用它,我会得到一个例外,我的一个对象没有设置cascade persist。有谁能解释一下幕后是怎么做的?我应该怎么做才能正确地取消设置所有条令的对象?问题是,实体管理器处理所有对象。如果在每次X迭代后不需要ram中的对象,则应该

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

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

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

从前面提到的链接:

条令中的批量插入最好分批执行,以 事务性写后行为的优点 实体管理器。下面的代码显示了插入10000的示例 批处理大小为20的对象。您可能需要尝试使用 批量大小,以找到最适合您的大小。大批量 大小意味着更多准备好的语句在内部重用,但也意味着更多 冲水时工作


我在批量插入记录(超过100K)时也遇到过类似的情况。我遵循了Rauni和Besnik的建议以及Doctrine的批处理指南,但即使在$em->clear()和resetEntityManager()之后,内存仍在增长。几天后,我领导了关于条令文件的信息通知:

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

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