Bonjour à tous, je viens vers vous pour vous demander une aide sur la résolution d'un grand système linéaire par une méthode itérative
J'ai un programme fonctionnel, tout est calé théoriquement, et l’algorithme converge vers le résultat souhaité
J'aimerais accroître la taille des données et je fais face à un pb de performance. Aussi je voulais voir avec vous quelles possibilités il y aurait de réécrire l'algorithme de façon plus performante.
Je dispose d'une base principale dont la taille idéale serait d'un million de lignes et de petites base cibles dont le total cumulé des lignes est d'environ 1000.
l'opération élémentaire dans l'algorithme se déroule en 2 étapes
- CALCUL de L'ERREUR (dans les petites bases)
- CORRECTION (dans la grande base)
après analyse des temps l'étape de correction est beaucoup plus longue que l'étape de calcul (dont le temps est négligeable en fait)
L'étape de calcul de l'erreur est la suivante, rien d'extraordinaire
1 2 3
| SELECT Cible6.Académie, Cible6.Degré, ([Cible6].[Effectifs]-[CALCUL])/[COHORTE] AS Erreur, Cible6.Effectifs, Sum(Table1_en_cours_de_convergence.Effectif_temp) AS CALCUL, Count(Table1_en_cours_de_convergence.sexe) AS COHORTE INTO ErreurCible6
FROM Cible6 LEFT JOIN Table1_en_cours_de_convergence ON (Cible6.Degré = Table1_en_cours_de_convergence.Degré) AND (Cible6.Académie = Table1_en_cours_de_convergence.Académie)
GROUP BY Cible6.Académie, Cible6.Degré, Cible6.Effectifs; |
L'étape de correction est la suivante (requête UPDATE)
UPDATE ErreurCible6 RIGHT JOIN Table1_en_cours_de_convergence ON (ErreurCible6.Degré = Table1_en_cours_de_convergence.Degré) AND (ErreurCible6.Académie = Table1_en_cours_de_convergence.Académie) SET Table1_en_cours_de_convergence.Effectif_temp = IIf([Effectif_temp]+[ErreurCible6].[Erreur]/10<0,0,[Effectif_temp]+[ErreurCible6].[Erreur]/25);
la requête est toute bête mais en terme de temps de calcul
pour une grande table de 50 000 lignes je suis à 200s
pour une grande table de 500 000 lignes je suis à 5000s
au vu du nombre d'itérations nécessaire pour faire converger l'algorithme, les 5000s paraissent trop mais après plus j'ai de ligne mieux c'est par rapport à la précision souhaitée, 50 000 c'est un peu décevant...
mis à part des optimisations théoriques consistant à enlever les lignes inutiles de la grande base au fur et à mesure avec une requête suppression (ce qui est prévu) je chercherais donc un moyen d'effectuer cette opération de mise à jour de façon plus efficace, si jamais c'est possible.
est ce qu'éventuellement ça serait plus rapide de juste écrire
[Effectif_temp]+[ErreurCible6].[Erreur]/25
et de virer les valeurs négatives dans un second temps ?
éventuellement, est ce que passer sous SAS permettrait d'être plus efficace ?
Merci beaucoup pour votre aide
Partager