SAS Mainframe

SAS en Mainframe: ¿Qué hacer cuando la biblioteca WORK está llena?

Simon 21/04/2009 5 vistas

El error "File is full and may be damaged" es un clásico temido por los usuarios de SAS©, particularmente cuando extraen grandes volúmenes de datos (como tablas DB2).

En un PC (Windows), esto generalmente significa que su disco duro está lleno. Pero en un Mainframe (z/OS), la lógica es más sutil: el disco no está necesariamente lleno, pero ha excedido el espacio que le fue asignado.

A continuación, se explica cómo comprender y resolver este problema de asignación de espacio, basándose en los consejos de expertos del foro.

1. El Diagnóstico: La asignación de espacio en Mainframe

A diferencia de Windows, donde un archivo crece mientras haya espacio, el Mainframe exige que el espacio se defina de antemano (pre-asignado) a través de Extents.

El sistema funciona en dos etapas:

  1. Asignación Primaria: Un gran bloque de espacio reservado al inicio del trabajo.

  2. Asignaciones Secundarias: Pequeños bloques adicionales que el sistema busca si el bloque primario está lleno (generalmente limitado a 15 o 16 extensiones).

El error ERROR: Write to WORK.A.DATA failed. File is full significa que SAS© ha llenado la asignación primaria Y todas las asignaciones secundarias autorizadas.

2. Solución 1: La Compresión (El reflejo inmediato)

Antes de solicitar más espacio en disco a la administración, intente reducir el tamaño de sus datos. El experto David sugiere activar la compresión binaria. En datos voluminosos que contengan texto o repeticiones, esto puede reducir el tamaño entre un 50% y un 80%.

Código SAS©:

1/* Compression activée pour cette table spécifique */
2DATA WORK.A (compress=yes);
3 SET DB2.GRANDE_TABLE;
4RUN;
5 
6/* OU activée globalement pour toute la session */
7options compress=yes;
Nota: Esto aumenta ligeramente el uso de la CPU, pero reduce considerablemente las E/S (Entradas/Salidas), lo que a menudo es beneficioso en Mainframe.

3. Solución 2: Modificar los Parámetros JCL (WORK)

Si la compresión no es suficiente, es necesario solicitar más espacio al iniciar el Job. En Mainframe, SAS© se inicia mediante un script JCL (EXEC SAS©...). Puede pasar un parámetro WORK para redefinir el tamaño de las asignaciones.

Sintaxis JCL típica (Batch):

1//MONJOB EXEC SAS913,WORK='500 200'
  • 500: Tamaño de la asignación Primaria (en cilindros o pistas según la configuración del sitio).

  • 200: Tamaño de la asignación Secundaria.

El cálculo del experto: David recomienda una estrategia "90/10":

  • Estime el tamaño total final.

  • Asigne el 90% de este tamaño en Primaria.

  • Asigne el 10% en Secundaria.

Esto evita la fragmentación y reduce el riesgo de fallos tardíos si el disco está físicamente fragmentado.

4. Solución 3: La Artillería Pesada (Spanning Volumes)

A veces, un solo disco físico (volumen DASD) no es suficiente para contener su tabla temporal, incluso utilizando todo el espacio disponible (aproximadamente 4300 cilindros en los modelos antiguos 3390).

El experto Chuck explica cómo extender la biblioteca WORK a varios volúmenes físicos. Esto requiere modificar el JCL para concatenar varias asignaciones de disco.

Ejemplo de JCL avanzado:

1//WORK DD DSN=&&WORK,SPACE=(CYL,(4300,100)),UNIT=SASDS,VOL=SER=VOL01
2// DD DSN=&&WORK,SPACE=(CYL,(4300,100)),UNIT=SASDS,VOL=SER=VOL02
3// DD DSN=&&WORK,SPACE=(CYL,(4300,100)),UNIT=SASDS,VOL=SER=VOL03
Nota: Esta técnica está reservada para usuarios avanzados que tienen acceso a la configuración JCL detallada.

Si encuentra el error "File Full" en Mainframe:

  1. Comprima (COMPRESS=YES): Es sencillo y a menudo suficiente.

  2. Aumente la asignación (WORK='Prim Sec'): Solicite más cilindros en su JCL.

  3. Verifique el SMS: A veces, la clase de almacenamiento (Storage Management Subsystem) limita automáticamente el tamaño de los archivos. En ese caso, deberá contactar al administrador del sistema.

Referencias y Documentos