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 :

Doctrine Fixtures - Allowed memory size


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut Doctrine Fixtures - Allowed memory size
    Bonjour à vous !

    J'ai installé le bundle DoctrineFixtures pour pouvoir injecter rapidement quelques données dans la base de données.

    Dans mon exemple je veux ajouter une liste de continents/pays/nationalités, régions/départements/villes françaises, avec toutes les relations qui vont bien.

    Le soucis est que j'ai tout ceci dans des fichiers XML et que celui des villes de France est assez énorme, presque 37000 villes.
    Et du coup je me retrouver avec une belle erreur PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes) in /home/.......
    J'ai donc "isolé" l'ajout des villes dans un autre fichier de chargement de fixtures, et je passe par référence tout les départements précédemment ajoutés.
    Mais en vain, c'est toujours pareil

    Avez-vous déjà voulu injecter beaucoup de données par cette méthode de Fixtures ?

    Je n'ai plus beaucoup d'idées, mais à mon avis c'est l'association au département qui pose problème, vu que je manipule beaucoup d'entités.

    Cela n'existe pas des instances d'entité en version light ?

    Si vous avez des idées, je suis toute ouïe ! Merci.


    PS : Je ne sais pas vraiment quoi placer comme bout de code.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Par défaut
    Pour des besoins ultra spécifique d'import maitrisé ou autre perso souvent j'utilise un simple :

    @ini_set('memory_limit', -1);

    Pour éviter ce genre de soucis quand c'est des libs qui posent soucis et que tu n'as pas forcement la main.

    Bien entendu a ne pas utiliser n'importe ou et n'importe comment pour ne pas plomber des serveurs de production

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Merci Tolriq.
    Effectivement je peux faire cela oui. Tout de façon j'utilise uniquement ces fixtures quand je viens de re-créer la base de données, donc c'est seulement en dev pour le moment.

    Par contre pour la mise en production, il faudrait que je fasse attention oui.


    Mais je trouve quand même cela bizarre, un XML de 37000 éléments, faire un persist sur chaque entité créée et flush à la fin, cela dépasse la mémoire autorisée.

    Sinon je pourrais faire des simples requêtes SQL

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Testé avec des requêtes SQL, mais problème de clés étrangères, ainsi que pour récupérer les "last_insert_id"... Bref ca double le code initial avec Doctrine.

    Me reste toujours la solution d'en faire un import SQL, au lieu de fixtures

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Bon ca ne passe même pas avec @ini_set('memory_limit', -1);

    Quand je fais un flush après la boucle, ca reste bloqué, ca ne renvoie même pas une exception. Et quand je fais un flush pour chaque persist dans la boucle, ca prend énormément de temps et beaucoup de ressources, donc ce n'est pas la solution.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Me revoilà avec la solution

    En voulant faire un client de WebService, je me suis confronté avec plus ou moins le même problème, des temps de requête très longs, et beaucoup de mémoire utilisée.

    J'ai donc trouvé cet article assez sympathique sur le Batch Processing avec Doctrine2 :
    http://www.doctrine-project.org/docs...tch-processing

    Ceci en place c'était beaucoup mieux, mais pas suffisant. J'ai cherché encore, et j'ai trouvé la formule magique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine:fixtures:load --fixtures=src/.../ --append --no-debug
    Ce no-debug est utilisable pour toute les commandes apparemment, mais du coup pour le chargement de fixtures en masse, c'est très très utile.

    Voili voilou, en espérant que ca aidera du monde

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

Discussions similaires

  1. [Images] Galerie photo (Fatal error: Allowed memory size)
    Par Dookie dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 25/05/2010, 12h13
  2. [PEAR][Mail] Fatal Error : Allowed memory size of 8388608 bytes exhausted
    Par bigben89 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 20/10/2008, 18h01
  3. Réponses: 3
    Dernier message: 08/08/2007, 19h08
  4. [Librairies] zip.lib.php Fatal error: Allowed memory size of 8388608 bytes exhausted
    Par manaboko dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/05/2006, 10h42
  5. Fatal error: Allowed memory size of...
    Par Webfab dans le forum Langage
    Réponses: 3
    Dernier message: 17/09/2005, 10h11

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