[Symfony] Out of memory command

Par Manuel Alvarez-Iglisias, il y a 8 ans


Bonjour,
J'ai un soucis lorssque j'execute ma commande symfony.
Celle ci plante à 82%.

protected function execute(InputInterface $input, OutputInterface $output) { $argument = $input->getArgument('argument'); $manager = $this->getContainer()->get("doctrine")->getManager(); $aliasManager = $this->getContainer()->get("doctrine")->getManager("alias"); $encoursImport = $aliasManager->getRepository("EncoursBundle:Encours")->getAllImport(); $Users = $manager->getRepository("EncoursBundle:Encours")->getUsers(); $output->writeln('Importation des encours.....'); $progress = new ProgressBar($output, count($encoursImport)); $progress->setRedrawFrequency(400); $progress->setFormat("very_verbose"); $progress->start(); if(empty($Users)){ foreach ($encoursImport as $item){ $numEtablissement = $item->getNUETABLISSEMEN(); $libelle = $item->getLibelleEcriture(); $piece = $item->getPIECE(); $numCompta = $item->getNUCOMPTA(); $debit = $item->getDEBIT(); $credit = $item->getCREDIT(); $solde = $item->getSOLDE(); $provenance = $item->getProvenance(); $dateEcriture = $item->getDATEEcriture(); $dateModif = $item->getDateModification(); $user = $manager->getRepository("UserBundle:User")->getUserByNumCompta($numCompta); $encours = new Encours(); $encours->setNUETABLISSEMEN($numEtablissement); $encours->setLibelleEcriture($libelle); $encours->setPIECE($piece); $encours->setNUCOMPTA($numCompta); $encours->setDEBIT($debit); $encours->setCREDIT($credit); $encours->setSOLDE($solde); $encours->setProvenance($provenance); $encours->setDATEEcriture($dateEcriture); $encours->setDateModification($dateModif); $encours->setUser($user); $manager->persist($encours); $progress->advance(); } }else { foreach ($Users as $user){ $encoursUser = $manager->getRepository("EncoursBundle:Encours")->findBy([ "nUCOMPTA" => $user->getNUCOMPTA() ]); if(!empty($encoursUser)){ foreach ($encoursUser as $encours){ $manager->remove($encours); } } } $manager->flush(); foreach ($encoursImport as $item){ $numEtablissement = $item->getNUETABLISSEMEN(); $libelle = $item->getLibelleEcriture(); $piece = $item->getPIECE(); $numCompta = $item->getNUCOMPTA(); $debit = $item->getDEBIT(); $credit = $item->getCREDIT(); $solde = $item->getSOLDE(); $provenance = $item->getProvenance(); $dateEcriture = $item->getDATEEcriture(); $dateModif = $item->getDateModification(); $user = $manager->getRepository("UserBundle:User")->getUserByNumCompta($numCompta); $row = explode(":", $libelle); if(count($row) > 1){ $reference = trim($row[1]); $encoursTemp = $manager->getRepository("EncoursBundle:EncoursTemp")->findBy([ "numTransaction" => $reference, "nUCOMPTA" => $user->getNumCompta() ]); if(!empty($encoursTemp)){ $manager->remove($encoursTemp[0]); } } $manager->flush(); $encours = new Encours(); $encours->setNUETABLISSEMEN($numEtablissement); $encours->setLibelleEcriture($libelle); $encours->setPIECE($piece); $encours->setNUCOMPTA($numCompta); $encours->setDEBIT($debit); $encours->setCREDIT($credit); $encours->setSOLDE($solde); $encours->setProvenance($provenance); $encours->setDATEEcriture($dateEcriture); $encours->setDateModification($dateModif); $encours->setUser($user); $manager->persist($encours); $progress->advance(); } } $manager->flush(); $progress->finish(); $output->writeln(' '); $output->writeln('Opération terminée.'); } Importation des encours..... 16000/19422 [=======================>----] 82% 1 min/1 min Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1179648 bytes) in /Users/deshiloh/Sites/aliasPaiement/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 1219 10:10:14 CRITICAL [php] Fatal Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1179648 bytes) ["exception" => Symfony\Component\Debug\Exception\OutOfMemoryException { …}] [] [Symfony\Component\Debug\Exception\OutOfMemoryException] Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1179648 bytes)

3 réponses

nova, il y a 8 ans

Bonjour Manuel,

Alors soit tu as une belle fuite de mémoire, soit il y a vraiment beaucoup de données à analyser. J'ai une petite solution pour que cela fonctionne mais ce n'est pas la solution en soi.
Modifie la valeur dans les configurations de php avec init_set

ini_set('memory_limit', '-1');
Manuel Alvarez-Iglisias, il y a 8 ans

Et qu'elle serais la solution en soi ? car je vois pas du tout d'où cela pourrais venir.
J'ai même essayé une méthode que j'ai trouvé sur internet :

foreach ($encoursImport as $item){ $numEtablissement = $item->getNUETABLISSEMEN(); $libelle = $item->getLibelleEcriture(); $piece = $item->getPIECE(); $numCompta = $item->getNUCOMPTA(); $debit = $item->getDEBIT(); $credit = $item->getCREDIT(); $solde = $item->getSOLDE(); $provenance = $item->getProvenance(); $dateEcriture = $item->getDATEEcriture(); $dateModif = $item->getDateModification(); $user = $manager->getRepository("UserBundle:User")->getUserByNumCompta($numCompta); $encours = new Encours(); $encours->setNUETABLISSEMEN($numEtablissement); $encours->setLibelleEcriture($libelle); $encours->setPIECE($piece); $encours->setNUCOMPTA($numCompta); $encours->setDEBIT($debit); $encours->setCREDIT($credit); $encours->setSOLDE($solde); $encours->setProvenance($provenance); $encours->setDATEEcriture($dateEcriture); $encours->setDateModification($dateModif); $encours->setUser($user); $manager->persist($encours); $progress->advance(); $count ++; if(($count % $batchSize ) == 0){ $manager->flush(); $manager->clear(); $count = 1; } }

Mais ça ne fonctionne pas également.

nova, il y a 8 ans

J'ai pas vraiment d'idée, on va essayer avec memory_get_usage ()

// 93952409 => 70% de la mémoire utilisé if(memory_get_usage () > 93952409 ){ $manager->flush(); $manager->clear(); }

Par contre je me demande si on fait un persist($object), la manager fait peut-être une copie de l'objet. Si c'est le cas tu pourrais unset($encours); après chaque persist.