SAS9

Optimiser les performances de PROC SUMMARY dans SAS Enterprise Guide

Simon 15 vistas
Niveau de difficulté
Débutant
Publicado el :
Michael

Consejo del experto

Michael

Ne confondez pas temps de calcul et temps de rendu : dans SAS Enterprise Guide, le 'goulot d'étranglement' est rarement le processeur, mais souvent le flux de données généré par l'Output Delivery System (ODS) vers l'interface. Pour les gros volumes, l'option NOPRINT couplée à NWAY n'est pas une simple optimisation, c'est une nécessité absolue pour éviter que l'interface ne tente de télécharger et d'afficher des millions de lignes de statistiques intermédiaires inutiles

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.

Optimiser les performances de PROC SUMMARY dans SAS Enterprise Guide -

Diagnostiquer avec FULLSTIMER

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.

1options fullstimer;

Le piège de l'option PRINT et de l'ODS

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 :

  • Supprimez l'option PRINT.

  • Fermez les destinations de sortie (ODS) avant la procédure pour éviter toute génération automatique de rapport graphique ou HTML.

1ods _all_ close;
2/* Empêche la génération de sorties visuelles lourdes */

Préférer NWAY au filtrage _TYPE_

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) :

1PROC SUMMARY DATA=MaTable;
2 class var1 var2;
3 OUTPUT out=Resultat (where=(_type_=3)); /* Nécessite de connaître la valeur du type */
4RUN;

Après (Recommandé) :

1PROC SUMMARY DATA=MaTable nway;
2 class var1 var2;
3 OUTPUT out=Resultat;
4RUN;

Combiner PROC SORT et traitement par BY

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 :

1options fullstimer;
2 
3/* 1. Tri des données en incluant la variable de regroupement principale */
4PROC SORT DATA=&FName.;
5 BY Policy_number INCEPTION_DATE_ADJ broker_number;
6RUN;
7 
8/* 2. Fermeture des sorties ODS pour éviter les lenteurs d'affichage dans EG */
9ods _all_ close;
10 
11/* 3. Utilisation de NWAY et passage d'une variable en BY */
12PROC SUMMARY DATA=&FName. nway;
13 BY broker_number; /* Traitement séquentiel, moins de mémoire */
14 class year month type3;
15 var nbu_pol nbu_prem;
16 OUTPUT out=new_business_summary (drop=_freq_) sum=;
17RUN;
18 
19/* 4. Réactivation de l'affichage pour voir le résultat final si nécessaire */
20ods listing;
21PROC PRINT DATA=new_business_summary;
22RUN;

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.