迭代学说集合会占用太多内存

时间:2015-02-16 15:48:07

标签: php symfony doctrine-orm

我有一个symfony2命令,它可以浏览我的大数据库并将数据导出到XML文件中。

这个操作占用了太多的内存,我可以看到我的php进程在运行时开始占用50 MB,然后是100Mb ..并且在5分钟后它是700MB并且在它完成之前它需要~800MB,这显然是巨大的。

如何优化Doctrine使用的内存量?

以下是我的代码的样子:

  // Gets 4000 entities
  $entities1 = $this->doctrine->getRepository('MyBundle:Entity1')->findAll();


    foreach ($entities1 as $entity1)
    {
         // 200 entities under every entity1
         foreach ($entity1->getCollection1() as $c)
         {
               // write into an xml
         }
    }

有没有办法优化这个/做得更好?

1 个答案:

答案 0 :(得分:5)

我建议使用“批处理”原则(http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html)。

它允许您处理大量数据并限制使用的php内存。所以在你的情况下会是这样的:

  $em = $this->doctrine->getManager();
  // Gets 4000 entities
  $queryEntities1 = $em->createQuery('select e from MyBundle:Entity1');
  $iterableEntities1 = $queryEntities1->iterate();

    foreach ($iterableEntities1 as $row)
    {
         $entity1 = $row[0];
         // 200 entities under every entity1
         foreach ($entity1->getCollection1() as $c)
         {
               // write into an xml
         }
         $em->detach($entity1);
    }

未经测试,但您可能需要为您的收藏添加其他查询!但是这样你的内存将在每个实体之后被清除(不确定它在你的情况下是否足够,但你仍然可以尝试为该集合的foreach添加另一个可迭代请求)。