Uploaded image for project: 'Doctrine 2 - ORM'
  1. Doctrine 2 - ORM
  2. DDC-1783

Combination of Query::iterate() and ObjectHydrator results in continued memory growth after clearing the entity manager


    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.2.2
    • Fix Version/s: 2.2.3
    • Component/s: ORM
    • Security Level: All
    • Labels:
    • Environment:
      ubuntu 11.04, php 5.3.6-13ubuntu3.6


      To reproduce:

      Start with the doctrine sandbox. Remove address relation from user. append the following to index.php

      for($i=0;$i<100000;++$i) {
      $user = new User;
      $user->setName('foo' . $i);

      $query = $em->getRepository('Entities\User')>createQueryBuilder('u')>getQuery();
      $i = 0;
      echo "Running test:" . PHP_EOL . "start: " . memory_get_usage() . PHP_EOL;
      foreach($query->iterate() as $row) {
      if (++$i === 100000)

      { echo "end: " . memory_get_usage() . PHP_EOL; }


      echo PHP_EOL . "done" . PHP_EOL;

      The result i get is

      Running test:
      start: 7658928
      end: 32601776

      Adding my own custom hydrator which simply extends and resets the ObjectHydrator::_identifierMap (may cause bugs, i dont know) i get

      Running test:
      start: 7658768
      end: 10724984

      This originally came up while working with an process to import an existing doctrine table of ~10M rows into elastic search. I realize going through the ORM will never be the most efficient, but there is room for more efficiency. With larger objects and larger result sets the memory growth is much more pronounced.

      1. sandbox.tgz
        384 kB
        Erik Bernhardson



          • Assignee:
            beberlei Benjamin Eberlei
            ebernhardson Erik Bernhardson
          • Votes:
            0 Vote for this issue
            0 Start watching this issue


            • Created: