IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Dépassement de mémoire [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut Dépassement de mémoire
    Bonjour,

    Nous sommes en train de crééer un batch d'import de données depuis un fichier excel.
    Nous l’exécutons en tant que commande.

    En gros, ce batch fais les opérations suivantes :
    récupération du contenu du fichier excel dans un tableau (peu gourmand en mémoire)
    pour chaque ligne de ce tableau{
    on regarde si on l'a déjà en base(très gourmand 5MB)
    si non, on créé l'objet
    on modifie quelques valeurs de l'objet
    on le met a jour, on persist
    tous les 20 enregistrement ou pour le dernière occurrence, on flush et clear l'entité manager.
    }
    Jusque là, ca devrait bien fonctionner... sauf que le système est ultra lent, et qu'on encrasse la mémoire progressivement avec des données que l'on utilise surement plus.

    Est-ce que vous voyez quelque chose à mettre en place pour que ca fonctionne mieux ?
    Merci,
    Pierre

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    private function importOceaneTicket($exports_path, $export_date, $em) {
           echo __FUNCTION__ ;
     
            $batchsize = 20;
            $xls = new Reader($exports_path . $export_date . "/00_tbl_tickets.xls");
            $c = $xls->rowcount();
            for ($row = 2; $row <= $c; $row++) {
                $ticketid = utf8_encode($xls->val($row, 1));
                $Status = utf8_encode($xls->val($row, 2));
                $InitiatorGroupID = utf8_encode($xls->val($row, 3));
                $InitiatorGroupname = utf8_encode($xls->val($row, 4));
                $InitiatorCountry = utf8_encode($xls->val($row, 5));
                $InitiatorUserName = utf8_encode($xls->val($row, 6));
                $Product_type = utf8_encode($xls->val($row, 7));
                $Identifier_1 = utf8_encode($xls->val($row, 8));
                $Identifier_2 = utf8_encode($xls->val($row, 9));
                $Identifier_3 = utf8_encode($xls->val($row, 10));
                $Monitored_reference = utf8_encode($xls->val($row, 11));
                $Last_user = utf8_encode($xls->val($row, 12));
     
                $ticket = $this->checkDolphinTicket($em, $ticketid);//here is the issue
     
                //update with oceane field
                $datanow = new DateTime('now');
                $datanow->format('d-m-Y H:i:s');
                $ticket->setUpdateDate($datanow);
                $ticket->setOceaneStatus($Status);
                $ticket->setOceaneInitiatorGroupId($InitiatorGroupID);
                $ticket->setOceaneInitiatorGroupName($InitiatorGroupname);
                $ticket->setOceaneInitiatorCountry($InitiatorCountry);
                $ticket->setOceaneInitiatorUsername($InitiatorUserName);
                $ticket->setOceaneProductType($Product_type);
                $ticket->setOceaneIdentifier1($Identifier_1);
                $ticket->setOceaneIdentifier1($Identifier_2);
                $ticket->setOceaneIdentifier1($Identifier_3);
                $ticket->setOceaneMonitoredReference($Monitored_reference);
                $ticket->setOceaneLastUser($Last_user);
                $em->persist($ticket);
                if (($row % $batchsize) == 0) {
                    $em->flush();
                    $em->clear();
                }
                unset($ticket);
            }
            $em->flush();
            $em->clear();
            unset($c);
            unset($xls);
        }
    And the code of the function checkDolphinTicket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private function checkDolphinTicket($em, $id) {
            $dolphin_ticket = $em->getRepository('ToolBundle:Ticket')->findOneBy(array('sspo_tid' => $id));
            if ($dolphin_ticket == null) {
                $dolphin_ticket = $this->insertTicket($em, $id);
            } else {
                $current_status = $dolphin_ticket->getStatus();
                if ($current_status == '3') {
                    $dolphin_ticket->setStatus('0');
                }
            }
            return $dolphin_ticket;
        }

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu as déjà mis des unset à chaque boucle...
    Pas facile : perso les imports massifs, j'ai arrêté de les coder en PHP :
    c'est EXCEL -> CSV -> PROCEDURE STOCKEE (LOAD DATA INFILE)

    Après y aura pas de miracle non plus : les imports c'est du lourd 9 fois sur 10...

    PS : tu as essayé en te passant de Doctrine and CO : coder tout le SQL séparément dans un module Import par exemple ?

  3. #3
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Bonjour,

    On pourrait le faire par import, mais on est sur des volumes faibles(3-400 tickets modifiés... pas non plus la mort normalement)

    En plus, on utilise postgres, et je n'ai toujours pas trouvé comment insérer les données dans la base par insert sans que doctrine gueule parce que les séquence sont corrompues après celà.

    Merci,
    Pierre

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Problème d'import il y'a 1 mois pour ma boite aussi, ca venait du fait de qu'on utilisé l'entity manager pour nos insertions.
    Vous manipulez des données avec l'entity manager?
    Si c'est le cas je vous conseil de faire des clear() tous les 50/100 flush().
    Le problème de ce bon vieux clear c'est que vos variables entités seront déliés, donc il faudra ré-instancier vos entités nécessaires à vos controles. (peut être utiliser $em->getReference au besoin)

    Doctrine déconseille l'utilisation de l'em pour les imports.


    Voila les infos en vrac que j'ai pu obtenir en réglant mon problème similaire

  5. #5
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Hello,

    On fait un clear tout les 20 update.

    Pierre

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    As tu essaye en lançant ta commande en environnement de prod ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dépassement de mémoire pour liste liées
    Par jpascal dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/04/2008, 21h37
  2. Réponses: 6
    Dernier message: 13/12/2007, 19h18
  3. Re: dépassement de mémoire
    Par petdelascar dans le forum C
    Réponses: 8
    Dernier message: 05/12/2005, 22h17
  4. dépassement de mémoire
    Par petdelascar dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 15h13
  5. Qu'est-ce que "le dépassement de mémoire tampon"
    Par allex2108 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/09/2005, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo