CAS

Comment récupérer la taille mémoire de toutes les tables d'une CASLIB ?

Simon 24/08/2024 9 vues

Travailler avec SAS© Viya et le moteur CAS (Cloud Analytic Services) implique souvent de surveiller l'empreinte mémoire de vos données. Une question fréquente revient souvent : comment obtenir les détails de stockage (taille, utilisation mémoire) pour toutes les tables d'une librairie en une seule fois ?

Si vous avez déjà essayé d'utiliser des caractères génériques (wildcards) comme % dans l'action table.tabledetails, vous avez probablement rencontré une erreur. Cet article vous explique pourquoi et vous propose une solution robuste en CASL pour consolider ces informations dans un rapport unique.

Note :
L'action standard pour obtenir la taille d'une table est table.tabledetails. Cependant, elle est conçue pour analyser une table spécifique à la fois. Le code suivant échouera car l'option name n'accepte pas les motifs génériques :
1/* Ce code ne fonctionnera pas */
2PROC CAS;
3 TABLE.tabledetails / name="%" caslib="MaLib";
4QUIT;
Pour contourner cette limitation, il faut adopter une approche programmatique :

Lister toutes les tables disponibles.

Boucler sur cette liste.

Exécuter tabledetails pour chacune.

Consolider les résultats.
Note :
La solution la plus efficace utilise le langage de script de CAS (CASL). Voici la procédure complète, inspirée d'une solution validée par la communauté SAS©.

1. Préparation des données (Optionnel)
Pour tester le code, nous chargeons d'abord quelques tables d'exemple (Cars, Class, Baseball) dans la librairie casuser.
1cas mycas;
2LIBNAME casuser cas caslib=casuser;
3 
4PROC CASUTIL;
5 load DATA=sashelp.cars outcaslib="casuser" casOut="cars" replace;
6 load DATA=sashelp.class outcaslib="casuser" casOut="class" replace;
7 load DATA=sashelp.baseball outcaslib="casuser" casOut="baseball" replace;
8RUN;

Le Script de consolidation

Le script ci-dessous réalise l'opération en une seule étape PROC CAS. Il itère sur chaque table, récupère ses détails, et utilise une astuce avec datastep.runcode pour empiler (append) les résultats dans une table finale nommée allResults.

1PROC CAS;
2 /* 1. Récupérer la liste de toutes les tables de la librairie */
3 TABLE.tableinfo RESULT=rc / caslib="casuser";
4
5 /* Variable pour gérer la syntaxe d'ajout (append) après la première itération */
6 fragment=';';
7
8 /* 2. Boucler sur chaque table trouvée */
9 DO TABLE over rc["TableInfo"][,"Name"];
10
11 /* Récupérer les détails de la table courante */
12 TABLE.tabledetails RESULT=RESULT / name=TABLE caslib="casuser";
13
14 /* Sauvegarder le résultat temporaire dans une table CAS */
15 saveresult RESULT caslib="casuser" casout=TABLE;
16
17 /* 3. Générer et exécuter du code Data Step dynamiquement */
18 /* Cela permet d'ajouter le nom de la table source et de consolider les données */
19 code = "data casuser.allResults" || fragment ||
20 " set casuser." || TABLE || ";" ||
21 " length Data varchar(100);" ||
22 " Data='" || table || "';" || /* Ajoute une colonne avec le nom de la table */
23 " run;";
24
25 datastep.runcode / code=code;
26
27 /* Changer le fragment pour activer l'option append pour les tours suivants */
28 fragment='(append=yes);';
29 END;
30QUIT;
table.tableinfo : Cette action crée une table de résultats (stockée dans la variable rc) contenant la liste de toutes les tables présentes dans la librairie.

La boucle DO : Elle parcourt la colonne "Name" de la liste récupérée précédemment.

saveresult : Transforme le résultat en mémoire de l'action tabledetails en une véritable table CAS physique temporaire.

Construction dynamique du code (code=...) : C'est le cœur de l'astuce. On construit une chaîne de caractères contenant du code DATA step.

Au premier passage, on crée la table allResults.

Aux passages suivants, on ajoute (append=yes) pour ne pas écraser les données précédentes.

datastep.runcode : Exécute le code SAS© généré à la volée.

Après l'exécution de ce script, vous obtiendrez une table unique nommée casuser.allResults.

Cette table contiendra les métadonnées détaillées (taille compressée, taille des blocs, index, etc.) pour toutes vos tables, avec une colonne supplémentaire Data indiquant le nom de la table source. Vous pouvez ensuite utiliser cette table pour créer des rapports de monitoring ou des tableaux de bord sur l'utilisation de votre espace CAS.