2012-06-28 3 views
0

Я пытаюсь просмотреть 15 000 документов в MongoDB. Память использования php взрывается с Doctrine ODM. Я делаю последовательный скрипт, но память все еще растет.Doctrine2 ODM Free Memory

$nbrNoticesTotal = $noticesNbr['count']; 
     $page = 0; 
     $limit = 500; 
     $pt = 0; 
     $ptTotal = 0; 
     $notices = $dm->getRepository('Notice')->findLimit($page, $limit)->toArray(); 
     if ($nbrNoticesTotal > 0) { 
      while ($ptTotal < $nbrNoticesTotal) { 
       if ($pt >= $limit) { 
        unset($notices); 
        $this->getContainer()->get('doctrine.odm.mongodb.document_manager'); 
        $page += $limit; 
        $notices = $dm->getRepository('Notice')->findLimit($page, $limit)->toArray(); 
        $pt = 0; 
       } 
       foreach ($notices as $key => $notice) { 

        $pt++; 
        $ptTotal++; 
        //unset($notice); 
        unset($notices[$key]); 
       } 
      } 
     } 

Exemple в memory_get_usage():

2012-06-28 14:53:08.541-defaultLogger-DEBUG Start : 20,339,624 
2012-06-28 14:53:10.154-defaultLogger-DEBUG get package : 1 - 64,207,344 
2012-06-28 14:53:10.891-defaultLogger-DEBUG pointer time : 64,250,536 
2012-06-28 14:53:11.642-defaultLogger-DEBUG pointer time : 64,246,952 
2012-06-28 14:53:12.375-defaultLogger-DEBUG pointer time : 64,243,368 
2012-06-28 14:53:13.140-defaultLogger-DEBUG pointer time : 64,239,784 
2012-06-28 14:53:13.911-defaultLogger-DEBUG pointer time : 64,236,264 
2012-06-28 14:53:15.359-defaultLogger-DEBUG get package : 2 - 104,447,576 
2012-06-28 14:53:17.259-defaultLogger-DEBUG pointer time : 104,482,168 
2012-06-28 14:53:19.013-defaultLogger-DEBUG pointer time : 104,478,584 
2012-06-28 14:53:20.771-defaultLogger-DEBUG pointer time : 104,475,000 
2012-06-28 14:53:22.650-defaultLogger-DEBUG pointer time : 104,471,416 
2012-06-28 14:53:24.575-defaultLogger-DEBUG pointer time : 104,467,840 
2012-06-28 14:53:26.081-defaultLogger-DEBUG get package : 3 - 139,016,152 
2012-06-28 14:53:29.192-defaultLogger-DEBUG pointer time : 139,046,936 
2012-06-28 14:53:32.560-defaultLogger-DEBUG pointer time : 139,043,360 
2012-06-28 14:53:35.456-defaultLogger-DEBUG pointer time : 139,039,912 
2012-06-28 14:53:38.229-defaultLogger-DEBUG pointer time : 139,036,336 

Что я могу сделать, чтобы очистить память? (unset не работает)

ответ

1

Попробуйте использовать EntityManager :: clear метод сообщить DC, чтобы очистить объекты.

Кроме того, насколько я помню, Еогеасп делает копию массива и снята с охраной в цикле Еогеаспа на отключенный элемент из массива не будет работать - я имею в виду использования памяти, попробуйте использовать для вместо Еогеаспа.

Также пытайтесь использовать $ value = null; Вместо unset becouse unset просто сообщает GC GC, что он может удалить это из памяти - но вы не знаете, когда он это сделает. Есть некоторые темы о unset & null - Я могу ошибаться на этом этапе.

Я надеюсь, что это поможет вам.

Также может быть другое место, где растет память.

+0

Отлично. Я использую DocumentManager :: clear и $ value = null; thank – vinzcoco

+0

Если это поможет, пожалуйста, отредактируйте вопрос и опубликуйте разницу для других людей :) –

Смежные вопросы