2012-06-28 6 views
0

J'essaie de parcourir 15 000 documents dans MongoDB. La mémoire d'utilisation de php explose avec Doctrine ODM. Je crée un script séquentiel mais la mémoire continue de croître.Doctrine2 ODM Mémoire libre

$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]); 
       } 
      } 
     } 

à memory_get_usage Exemple():

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 

Que puis-je faire pour effacer la mémoire? (non configuré ne fonctionne pas)

Répondre

1

Essayez d'utiliser EntityManager :: clear méthode pour indiquer DC pour effacer les objets.

également dans la mesure je me souviens foreach fait une copie du tableau et unset en boucle foreach à l'élément unset du tableau ne fonctionne pas - je veux dire l'utilisation de la mémoire, essayez d'utiliser pour au lieu de foreach.

Essayez également d'utiliser $ value = null; Plutôt que d'être mis à zéro, unset unset dit simplement au GC de PHP qu'il peut l'enlever de la mémoire - mais vous ne savez pas quand il va le faire. Il ya quelques sujets à propos de & null - Je peux me tromper à ce stade.

J'espère que cela vous aidera.

Il peut également y avoir un autre endroit où la mémoire se développe.

+0

Parfait. J'utilise DocumentManager :: clear et $ value = null; merci – vinzcoco

+0

Si cela aide, s'il vous plaît modifier la question et afficher la différence pour les autres :) –

Questions connexes