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)
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.