【问题标题】: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


    【解决方案1】:

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

    建议在每次大量操作后使用 $em->clear()。 (应该会产生与 Besnik 建议的效果相同的效果)。

    来自前面提到的链接:

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

    【讨论】:

      【解决方案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 秒。

        【讨论】:

          猜你喜欢
          • 2016-12-28
          • 2015-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-27
          • 2012-01-24
          • 1970-01-01
          相关资源
          最近更新 更多