SAS Mainframe

SAS sur Mainframe : Que faire quand la bibliothèque WORK est pleine ?

Simon 21/04/2009 5 vues

L'erreur "File is full and may be damaged" est un classique redouté des utilisateurs SAS©, particulièrement lorsqu'ils extraient de gros volumes de données (comme des tables DB2).

Sur un PC (Windows), cela signifie généralement que votre disque dur est plein. Mais sur un Mainframe (z/OS), la logique est plus subtile : le disque n'est pas forcément plein, mais vous avez dépassé l'espace qui vous était alloué.

Voici comment comprendre et résoudre ce problème d'allocation d'espace, basé sur les conseils d'experts du forum.

1. Le Diagnostic : L'allocation d'espace sur Mainframe

Contrairement à Windows où un fichier grandit tant qu'il y a de la place, le Mainframe exige que l'espace soit défini à l'avance (pré-alloué) via des Extents.

Le système fonctionne en deux temps :

  1. Allocation Primaire : Un gros bloc d'espace réservé au démarrage du job.

  2. Allocations Secondaires : Des petits blocs supplémentaires que le système va chercher si le bloc primaire est plein (généralement limité à 15 ou 16 extensions).

L'erreur ERROR: Write to WORK.A.DATA failed. File is full signifie que SAS© a rempli l'allocation primaire ET toutes les allocations secondaires autorisées.

2. Solution 1 : La Compression (Le réflexe immédiat)

Avant de demander plus d'espace disque à l'administration, essayez de réduire la taille de vos données. L'expert David suggère d'activer la compression binaire. Sur des données volumineuses comportant du texte ou des répétitions, cela peut réduire la taille de 50% à 80%.

Code 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;
Note : Cela augmente légèrement l'usage CPU, mais réduit considérablement les I/O (Entrées/Sorties), ce qui est souvent bénéfique sur Mainframe.

3. Solution 2 : Modifier les Paramètres JCL (WORK)

Si la compression ne suffit pas, il faut demander plus d'espace au lancement du Job. Sur Mainframe, SAS© est lancé via un script JCL (EXEC SAS©...). Vous pouvez passer un paramètre WORK pour redéfinir la taille des allocations.

Syntaxe JCL typique (Batch) :

1//MONJOB EXEC SAS913,WORK='500 200'
  • 500 : Taille de l'allocation Primaire (en cylindres ou pistes selon la config site).

  • 200 : Taille de l'allocation Secondaire.

Le calcul de l'expert : David recommande une stratégie "90/10" :

  • Estimez la taille totale finale.

  • Allouez 90% de cette taille en Primaire.

  • Allouez 10% en Secondaire.

Cela évite la fragmentation et réduit le risque d'échec tardif si le disque est physiquement fragmenté.

4. Solution 3 : L'Artillerie Lourde (Spanning Volumes)

Parfois, un seul disque physique (DASD volume) ne suffit pas pour contenir votre table temporaire, même en utilisant tout l'espace disponible (environ 4300 cylindres sur les anciens modèles 3390).

L'expert Chuck explique comment étendre la bibliothèque WORK sur plusieurs volumes physiques. Cela nécessite de modifier le JCL pour concaténer plusieurs allocations disques.

Exemple de JCL avancé :

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
Note : Cette technique est réservée aux utilisateurs avancés ayant accès à la configuration JCL détaillée.

Si vous rencontrez l'erreur "File Full" sur Mainframe :

  1. Comprimez (COMPRESS=YES) : C'est simple et souvent suffisant.

  2. Augmentez l'allocation (WORK='Prim Sec') : Demandez plus de cylindres dans votre JCL.

  3. Vérifiez le SMS : Parfois, la classe de stockage (Storage Management Subsystem) limite automatiquement la taille des fichiers. Il faudra alors contacter l'administrateur système.

Références & Docs