J'ai beaucoup de mal avec la combinaison de symfony2 et doctrine2. Je dois gérer d'énormes ensembles de données (environ 2 à 3 millions en écriture et en lecture) et je dois faire beaucoup d'efforts supplémentaires pour éviter de manquer de mémoire.
J'ai trouvé 2 points principaux, qui "fuient" de la mémoire (en fait, ils ne fuient pas vraiment, mais allouent beaucoup).
-
Le stockage d'entités d'Entitymanager (je ne connais pas le vrai nom de celui-ci) semble conserver toutes les entités traitées et vous devez vider ce stockage régulièrement avec
$entityManager->clear()
-
Le Doctrine QueryCache - il met en cache toutes les requêtes utilisées et la seule configuration que j'ai trouvée est que vous pouvez décider quel type de cache vous voulez utiliser. Je n'ai pas trouvé de désactivation globale ni de drapeau utile pour chaque requête pour le désactiver. Donc habituellement je le désactive pour chaque objet de requête avec la fonction
$qb = $repository->createQueryBuilder($a); $query = $qb->getQuery(); $query->useQueryCache(false); $query->execute();
Donc c'est tout ce que j'ai trouvé pour le moment Mes questions sont :
Existe-t-il un moyen simple de refuser certains objets dans le stockage Entitymanagerstorage ? Existe-t-il un moyen de définir l'utilisation du querycache dans le gestionnaire d'entités ? Est-ce que je peux configurer ce comportement de cache quelque part dans la configuration de Symfony/doctrine ?
Ce serait très cool si quelqu'un avait quelques conseils pour moi sinon cela pourrait aider certains débutants
cya
4 votes
La couche ORM D2 n'est pas vraiment conçue pour le traitement massif par lots. Vous feriez mieux d'utiliser la couche DBAL et de travailler uniquement avec des tableaux.
1 votes
Courir avec --no-debug aide beaucoup (en mode débogage, le profileur conserve des informations sur chaque requête en mémoire).