CAS

¿Cómo obtener el tamaño de la memoria de todas las tablas en una CASLIB?

Simon 24/08/2024 3 vistas

Trabajar con SAS© Viya y el motor CAS (Cloud Analytic Services) a menudo implica monitorear la huella de memoria de sus datos. Una pregunta frecuente es: ¿cómo obtener los detalles de almacenamiento (tamaño, uso de memoria) para todas las tablas en una librería a la vez?

Si ya ha intentado usar caracteres comodín (wildcards) como % en la acción table.tabledetails, probablemente se haya encontrado con un error. Este artículo le explica por qué y le ofrece una solución robusta en CASL para consolidar esta información en un informe único.

Note :
La acción estándar para obtener el tamaño de una tabla es table.tabledetails. Sin embargo, está diseñada para analizar una tabla específica a la vez. El siguiente código fallará porque la opción name no acepta patrones genéricos:
1/* Ce code ne fonctionnera pas */
2PROC CAS;
3 TABLE.tabledetails / name="%" caslib="MaLib";
4QUIT;
Para evitar esta limitación, es necesario adoptar un enfoque programático:

Listar todas las tablas disponibles.

Iterar sobre esta lista.

Ejecutar tabledetails para cada una.

Consolidar los resultados.
Note :
La solución más eficiente utiliza el lenguaje de scripting de CAS (CASL). Aquí está el procedimiento completo, inspirado en una solución validada por la comunidad SAS©.

1. Preparación de datos (Opcional)
Para probar el código, primero cargamos algunas tablas de ejemplo (Cars, Class, Baseball) en la librería 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;

El Script de consolidación

El script a continuación realiza la operación en un solo paso PROC CAS. Itera sobre cada tabla, recupera sus detalles y utiliza un truco con datastep.runcode para apilar (append) los resultados en una tabla final llamada 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: Esta acción crea una tabla de resultados (almacenada en la variable rc) que contiene la lista de todas las tablas presentes en la librería.

El bucle DO: Itera sobre la columna "Name" de la lista recuperada previamente.

saveresult: Transforma el resultado en memoria de la acción tabledetails en una verdadera tabla CAS física temporal.

Construcción dinámica del código (code=...): Este es el corazón del truco. Se construye una cadena de caracteres que contiene código DATA step.

En la primera pasada, se crea la tabla allResults.

En las pasadas siguientes, se añade (append=yes) para no sobrescribir los datos anteriores.

datastep.runcode: Ejecuta el código SAS© generado al vuelo.

Después de ejecutar este script, obtendrá una tabla única llamada casuser.allResults.

Esta tabla contendrá los metadatos detallados (tamaño comprimido, tamaño de bloques, índice, etc.) para todas sus tablas, con una columna adicional Data que indica el nombre de la tabla de origen. Luego puede usar esta tabla para crear informes de monitoreo o paneles sobre el uso de su espacio CAS.