Bonjour,

Je souhaite faire de très grosse fixture en symfony avec environs 5 000 000 de lignes mais le plus souvent j'ai un
out of memory qui se créer.
Comment optimiser mes fixtures pour ne plus avoir ce problème de mémoire ?
J'ai fait des flush régulièrement dans chaque foreach mais impossible de montrer très haut dans le nombre lignes.
est ce que ce nombre de lignes de fixtures vous paresse cohérent ?

Entourez votre code en utilisant "```" pour bien le mettre en forme. (ne copiez pas trop de code)

Ce que je veux

Décrivez ce que vous cherchez à obtenir.

Ce que j'obtiens

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

4 réponses


5 000 000? faudrait peut etre penser à fractionner la ficture :o

Sinon tu peux augmenter la limite memoire dans ton php.ini:
Tu ouvres le php.ini de ton serveur local (wamp, laragon, xamp...) et tu cherche "memory_limit" et tu augmentes la valeur, ensuite tu relances le serveur et ça devrait etre bon :)

Oublies pas en prod de faire la même chose ;) et pour le serveur remote faudra acheter un serveur avec au moins 2GB de RAM pour encaisser ;)

Désolé pour le temps de réponse, Merci pourta réponse. Je pense en effet que la seule solution est d'augmenter la ram du server.

La RAM et aussi le memory_limit, sinon ta RAM supplémentaire ne sera pas utilisée :p

Après le mieux serait de trouver un moyen de factoriser toutes ces fixtures, peut être les lancer coté serveur, ou bien utiliser des sytèmes plus rapides, comme un cluster Redis par exemple

Tu peux limiter et importer par petit paquet de données (10 000 par 10 000). Quelques pistes :

  • Désactiver le logger : $entityManager->getConnection()->getConfiguration()->setSQLLogger(null);
  • Vider les entité dans la mémoire de l'entity manager : $entityManager->flush(); et $entityManager->clear();
  • Ne pas récupérer un tros grand nombre de données par doctrine (utiliser des requêtes SQL directement si nécessaire).