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

Doctrine2 PHP Discussion :

Leak mémoire doctrine2


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut Leak mémoire doctrine2
    Bonjour,

    J'ai besoin de faire un import d'une base de donnée avec de nombreuses entrées (~300K), je me retrouve donc assez rapidement à exploser la limite de mémoire pour php.
    Je pourrai donc faire un : ini_set(“memory_limit”,”16M”);
    Mais bon il faudrait que j'alloue quelques Go ...

    J'ai cherché les leaks, ils viennent des entités doctrine ce qui parait logique, j'ai donc essayé de faire des unset sur chacune des entités récupérées, mais cela ne suffit pas, j'ai aussi fait des unset sur les entités après avoir été appelé persit, cela ne change toujours rien.

    Comment pourrai-je faire ?

    Cordialement,

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    montre ton code, sinon essaye avec un detach sur l'entitié

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    J'ai rajouté des detach un peu partout en rajouter "detach" au niveau du cascade, cela a diminué un peu le leak, mais il reste encore important.

    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
     
    while ($hasPros)
            {
                $idPros = $proRepository->findAllLimit(100, $i * 100);
                $hasPros = (count($idPros) == 100);
                foreach ($idPros as $value)
                {
                    try
                    {
                        $base = $importdata->handle($value);
                        $entityManager->persist($base);
                        $entityManager->flush();
                        $entityManager->detach($base);
                        unset($base);
                        $base = null;
                    }
                    catch (\Exception $err)
                    {
                        unset($base);
                        $base = null;
                        continue;
                    }
                }
                $entityManager->clear();
                unset($idPros);
                $idPros = null;
                $i++;
            }
    Je suis entrain de chercher la partie de mon code qui leak le plus.
    Pour le moment j'arrive a recupere 3000 octets sur environ 30000 octets.
    J'en perds 6000 au niveau du persist et flush, et le reste dans le handle.

    Je te tiens au courant quand je trouve la cause exacte.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est quoi le findAllLimit ? pourquoi ne pas faire un findBy direct ?
    le $importdata->handle correspond à quoi ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    findAllLimit me permet de recupére un array avec des limites ce qui n'est pas possible avec findBy.

    importdata->handle contient la gestion de mon importation des données.

    Mon leak vient de la récupération des entités via doctrine, cependant même après un detach, unset et null, cela ne suffit pas à récupérer la mémoire.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par mobuho Voir le message
    findAllLimit me permet de recupére un array avec des limites ce qui n'est pas possible avec findBy.
    si
    http://www.doctrine-project.org/api/...y.html#_findBy

    à mon avis tu fais beaucoup de boucle pour rien, à quoi correspond le premier while ?

    l'import du base c'est quel type de fichier un CSV ?

Discussions similaires

  1. EclipseLink et memory leak (fuite mémoire)
    Par jmturc dans le forum JPA
    Réponses: 2
    Dernier message: 24/12/2010, 11h46
  2. Memory leak ou fuite de mémoire
    Par bruce-willis dans le forum C++
    Réponses: 22
    Dernier message: 05/09/2008, 22h41
  3. [AJAX] Que faire contre les fuites mémoires (memory leaks)
    Par cassy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/08/2007, 16h50
  4. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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