update et problème mémoire
Bonjour,
J'utilise doctrine2 avec Symfony2.
J'ai une table de plusieurs millions de lignes.
Cette table est constituée d'un champ id, valeur1 et valeur2 (vide pour le moment).
Pour chaque ligne, il faut que je récupère la valeur1, faire un calcul assez complexe dessus (et qui implique d'autres tables), puis insérer le résultat dans valeur2.
Voici mon code simplifié :
Code:
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 29 30 31 32 33 34 35
|
$em = $this->getDoctrine()->getEntityManager();
$i=0;
$batchSize=20;
$offset=0;
$limit=10000;
// On récupère les $limit premières lignes de la table
$entity1 = $em->getRepository('MonNomBundle:MonEntity')
->findAll($offset, $limit);
// On parcours les résultats (j'ai suivi le tuto sur le batch Processing sur la doc de doctrine)
foreach ($entity1 as $row)
{
$toto = $row[0];
$valeur1 = $toto->getValeur1();
// On récupère différentes valeurs d'autres tables en fonction de valeur1
$autreValeur = $em->getRepository('MonNomBundle:Entity2')->getAutreValeur($valeur1);
// calcul assez complexe impliquant d'autres tables et permettant d'obtenir $valeur2
...
$valeur2=...
$toto->setValeur2($valeur2);
$em->persist($toto);
if (($i % $batchSize) == 0)
{
$em->flush();
$em->clear();
}
++$i;
} |
La mise à jour se passe très bien, de ce côté ça fait ce que je veux. Mon problème est que si je met une limit > à environ 10000, j'ai une erreur de mémoire. :?
D'après la document de doctrine 2 (partie batch processing), l'utilisation de $em->clear() libère la mémoire. Or j'ai fais de nombreux get_memory_usage() et $em->clear() ne me libère que très peu de mémoire à chaque fois qu'il s'exécute. Du coup ma mémoire augmente très vite jusqu'à saturation.
Pour l'instant je suis obligé de lancer à la main mon script 10000 par 10000 mais ce n'est pas une solution acceptable.
Quelqu'un aurait il une solution pour m'aider à libérer cette mémoire ?
Merci d'avance pour vos conseils éclairés.