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 :

[Doctrine] Enregistrement de milliers d'entités


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut [Doctrine] Enregistrement de milliers d'entités
    Bonjour à tous,


    Je tourne en rond sur un problème.
    J'ai plusieurs dizaines de milliers d'entités à enregistrer en base (la même entité avec plusieurs relations ManyToOne). Ce que je fais, c'est que je persist 1000 entités à la fois avant de faire un flush() mais le temps de traitement de chaque enregistrement de 1000 lignes est de plus en plus long.

    Pour les lignes 1 à 1000 = 3 s, 10001 à 11000 = 9 s, 25001 à 26000 = 21 s... et cela augmente de manière exponentielle.

    Quelqu'un aurait-il une idée pour optimiser ce genre d'enregistrement ? Je n'arrive pas du tout à voir à quoi cela est dû.

  2. #2
    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
    Bonjour,

    il faut faire un clear aprés le flush
    http://docs.doctrine-project.org/en/...rocessing.html

    et en ligne de commande, être en environnement de prod est préférable.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut
    Bonjour et merci pour la réponse.

    J'avais testé cette méthode mais le soucis est est que mon entité à une propriété ManyToOne pointant toujours vers la même donnée en base et qu'avec le clear(), il essaye d'enregistrer cette propriété comme nouvelle ligne (ce qui me donne un Doctrine\DBAL\Exception\NotNullConstraintViolationException).

    Mon traitement s'effectue bien via une ligne de commande.

  4. #4
    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
    En admettant que tu ai un code dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $linkedEntityId=569;
     
    $linkedEntity=$em->find('Entity1',linkedEntityId);
     
    foreach($entity2Iterator as $e){
     
      $e->setLink($linkedEntity);
      //faire un flush  tout les 1000
    }
    il faudrait le remplacer par quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $linkedEntityId=569;
     
    foreach($entity2Iterator as $e){
      $linkedEntity=$em->getReference('Entity1',$linkedEntityId);//getReference n'effectue pas de requete SQL, il te renvoit juste un objet que Doctrine saura persister (doctrine saura s'il faut faire un update ou un insert)
      $e->setLink($linkedEntity);
      //faire un flush + clear tout les 1000
    }
    Ou tout autre méthode pour récupérer les entités utiles lorsque l'on clear l'entity Manager

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut
    Merci pour ton aide mais malheureusement, j'ai le même soucis avec getReference(). Dès que clear() a été exécuté, le flush() d'après plante avec un Duplicate entry sur mon entité liée qu'il essaye de INSERT.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/11/2018, 15h41
  2. Doctrine enregistrement en double
    Par -abL^ dans le forum ORM
    Réponses: 2
    Dernier message: 08/02/2011, 19h20
  3. Réponses: 8
    Dernier message: 15/11/2010, 10h51
  4. Réponses: 6
    Dernier message: 04/11/2010, 12h11
  5. Suppresion enregistrement liaison n:n requete Doctrine
    Par symfony30000 dans le forum ORM
    Réponses: 3
    Dernier message: 11/05/2010, 11h34

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