Il arrive fréquemment qu'un programme SAS© s'exécute rapidement directement sur un serveur Unix, mais semble se figer ou prendre un temps infini lorsqu'il est lancé depuis l'interface SAS© Enterprise Guide (EG). Ce phénomène est souvent visible lors de l'utilisation de procédures d'agrégation comme PROC SUMMARY sur de gros volumes de données.
Si vous constatez que votre étape de tri (PROC SORT) s'exécute normalement, mais que le résumé statistique "mouline" indéfiniment, le problème ne vient pas nécessairement de la puissance de calcul, mais de la gestion des sorties.
Voici plusieurs stratégies pour diagnostiquer les lenteurs et optimiser drastiquement votre code.
Avant d'optimiser, il est utile de comprendre où les ressources sont consommées. L'ajout de l'option FULLSTIMER au début de votre programme permet d'afficher des statistiques détaillées sur le temps CPU, le temps réel et l'utilisation de la mémoire dans la log.
La cause la plus fréquente des lenteurs dans SAS© EG est la tentative d'affichage des résultats.
Lorsque vous utilisez l'option PRINT dans une PROC SUMMARY, SAS© tente de générer un rapport (souvent en HTML par défaut dans EG). Si vos variables de classification (CLASS) possèdent une cardinalité élevée (beaucoup de combinaisons uniques), la table de résultat est gigantesque. SAS© EG consomme alors énormément de mémoire et de temps pour transférer et rendre cet affichage, donnant l'impression que le calcul est bloqué.
La solution :
Une pratique courante consiste à générer toutes les statistiques puis à filtrer la table de sortie pour ne garder que le niveau d'agrégation le plus fin (là où toutes les variables de classe sont prises en compte) via une clause WHERE _TYPE_ = ....
Cependant, il est beaucoup plus efficace d'utiliser l'option NWAY. Cette option instruit SAS© de ne calculer et de n'écrire que les statistiques pour la combinaison de toutes les variables de classe, évitant ainsi le calcul inutile des sous-totaux intermédiaires.
Avant (moins efficace) :
Si votre table est très volumineuse, l'instruction CLASS peut être gourmande en mémoire car elle doit conserver les combinaisons en mémoire.
Une technique d'optimisation consiste à trier d'abord vos données, puis à utiliser une instruction BY à la place (ou en complément) de l'instruction CLASS dans la PROC SUMMARY. Le traitement par groupe (BY) est séquentiel et consomme moins de mémoire vive.
Puisque vous effectuez souvent un PROC SORT en amont, il suffit d'ajouter une des variables de regroupement dans ce tri.
Exemple de code optimisé
Voici à quoi ressemble le code final intégrant toutes ces améliorations :
En résumé, pour débloquer une PROC SUMMARY dans SAS© EG : supprimez l'affichage (PRINT), utilisez NWAY, et gérez intelligemment vos tris pour soulager la mémoire.