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


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');

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.

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.