IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

z/OS Discussion :

rexx et depassement de mémoire


Sujet :

z/OS

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut rexx et depassement de mémoire
    Bonjour,

    voilà exécutant un rexx, j'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    IRX0662E EXECIO error. Unable to obtain storage.                          
    LIGNE EN DOUBLON : PROBCF.ARCF.F0509221                            221344 
    ESPACE = 442688                                                           
        15 +++    CALL DOUB                                                   
    IRX0005I Error running DCOLL03N, line 56: Machine storage exhausted
    Voici mon rexx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    /*REXX*/                                                    
    /*TRACE I */                                                
    "EXECIO * DISKR DCOLIN (FINIS STEM DS."                     
      DO I = 1 TO DS.0                                          
          DSNAM.I = SUBSTR(DS.I,1,44)                           
          SPACE.I = SUBSTR(DS.I,46,9)                           
          CREAT.I = SUBSTR(DS.I,54,8)                           
          VOLUM.I = SUBSTR(DS.I,63,6)                           
          J = I + 1                                             
          DSNAM.J = SUBSTR(DS.J,1,44)                           
          SPACE.J = SUBSTR(DS.J,46,9)                           
          IF DSNAM.I = DSNAM.J THEN                             
          DO                                                    
             SPACETOT = 0                                       
             CALL DOUB                                          
          END                                                   
          ELSE                                                  
          DO                                                    
            SPACETOT = SPACE.I                                          
          END                                                           
          SPACETOT = SPACETOT % 55 /* CONVERSION EN TRACKS */           
          LSPACE = LENGTH(SPACETOT)                                     
          IF LSPACE < 7 THEN                                            
          DO                                                            
             LCORIG = 7 - LSPACE                                        
             SPACETOT = INSERT(" ",SPACETOT,,LCORIG)                    
          END                                                           
    /*      QUEUE DSNAM.I!!' 'SPACETOT!!' 'CREAT.I!!' 'VOLUM.I     */   
          DS.1  = DSNAM.I!!' 'SPACETOT!!' 'C                            
         "EXECIO 1 DISKW DCOLOUT (STEM DS."   /* ECRITURE 1 LIGNE  */   
      END                                                               
    "EXECIO 0 DISKR DCOLIN  (FINIS" /* CLOSE FICHIERS */                
    "EXECIO 0 DISKW DCOLOUT (FINIS" /* -------------- */                
    /*   QUEUE ""                                                       
        "EXECIO * DISKW DCOLOUT (FINIS"   */                            
      EXIT;                                                             
    DOUB:                                                               
    IF SPACETOT = 0 THEN                                   
    DO                                                     
       SPACETOT = SPACETOT + SPACE.J + SPACE.I             
       SAY 'LIGNE EN DOUBLON : 'DS.I                       
    END                                                    
    ELSE                                                   
    DO                                                     
       SPACETOT = SPACETOT + SPACE.J                       
    END                                                    
    I = I + 1                                              
    DSNAM.I = SUBSTR(DS.I,1,44)                            
    SPACE.I = SUBSTR(DS.I,46,9)                            
    CREAT.I = SUBSTR(DS.I,54,8)                            
    VOLUM.I = SUBSTR(DS.I,63,6)                            
    J = I + 1                                              
    DSNAM.J = SUBSTR(DS.J,1,44)                            
    SPACE.J = SUBSTR(DS.J,46,9)                            
    SAY 'ESPACE = 'SPACETOT                                
    IF DSNAM.J = DSNAM.I THEN CALL DOUB                    
    RETURN
    Savez-vous comment faire pour éviter cet overflow ?

  2. #2
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Après un rapide regard, je dirais que tu utilises des tableaux de variables mémoire indicées par 'J' inutiles et trés consommateurs. Rien que pour alimenter depuis la ligne + 1 une simple réservation non indicée pour la cible suffit. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     DO I = 1 TO DS.0                                          
          DSNAM.I = SUBSTR(DS.I,1,44)                           
          SPACE.I = SUBSTR(DS.I,46,9)                           
          CREAT.I = SUBSTR(DS.I,54,8)                           
          VOLUM.I = SUBSTR(DS.I,63,6)                           
          J = I + 1                                             
          DSNAM = SUBSTR(DS.J,1,44)                           
          SPACE = SUBSTR(DS.J,46,9)                           
          IF DSNAM.I = DSNAM THEN                             
          DO                                                    
             SPACETOT = 0                                       
             CALL DOUB                                          
          END
    Fais un change ALL DSNAME.J par DSNAME et SPACE.J par SPACE et ça devrait aller mieux. Autre chose, ton "EXECIO 0 DISKR DCOLIN (FINIS" /* CLOSE FICHIERS */ est en trop, tu as déjà un FINIS dans ton EXECIO * DISKR

  3. #3
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour

    tu vas devoir revoir ton rexx en suivant ces quelques conseils

    Avec le REXX, et pour des volumes importants, il faut éviter l'utilisation de "EXECIO *...." qui charge toutes les lignes en mémoire.
    Privilégier "EXECIO 1 ...". Ca sera plus lourd en code, mais beaucoup plus économe en ressources.

    Et dans le rexx, limite l'utilisation des tableaux (stem varibles indicées).

    Pour des opérations globales sur des fichiers, je privilégie le TRI (SORT & ICETOOL) qui permet beaucoup de chose (reformatage de records, calculs divers, ...).

  4. #4
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    je n'ai pas analyser dans le détail le rexx, mais ce tri devrait pas mal aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SORT FIELDS=(1,44,CH,A)              
    SUM FIELDS=(46,9,ZD)                 
    OUTREC OVERLAY=(46:46,9,ZD,DIV,+55)

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour,

    je reviens vers vous car les tests que j'ai effectué avecv vos conseils ont échoué...

    J'aimerais juste savoir s'il est possible avec ICETOOL d'additionner 2 champs de ligne successive et de mettre le résultat de cette addition sur une seule ligne.

    Je m'explique :

    J'ai un fichier avec plusieurs lignes qui ont chacune 2 champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    champa    num01
    champa    num02
    champa    num03
    champb    num04
    champb    num05
    champc    num06
    champd    num07
    Ce que je veux obtenir c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    champa    num01+num02+num03
    champb    num04+num05
    champc    num06
    champd    num07
    Merci d'avance pour votre aide.

  6. #6
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Le SUM Fields du SORT est fait ça. C'est d'ailleurs l'exemple indiqué par Bernard59139.
    Sort sur champs1, SUM FIELDS sur champs2
    Pour le REXX si les corrections ont échouées c'est que tu n'as pas la place mémoire pour lire le fichier par un EXECIO * DISKR.
    Dans ce cas, toujours, comme indiqué par bernard59139 et par ailleurs dans un post précédent, c'est une boucle sur EXECIO 1 DISKR qu'il faut faire.
    Dans ce cas toujours, c'est ton algorithme qui n'est pas adapté, il te faut procéder par rupture
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          DSNAM = SUBSTR(DS.1,1,44)                           
          SPACE = SUBSTR(DS.1,46,9)                           
          CREAT = SUBSTR(DS.1,54,8)                           
          VOLUM = SUBSTR(DS.1,63,6)
          if DSNAM = RDSNAM CALL CUMUL   /* Cumul sur zones en réserve */
          Else              CALL ECRIRE  /* Ecriture depuis enr. en réserve */  
          RDSNAM = DSNAM
          RSPACE = SPACE
          RCREAT = CREAT
          RVOLUM = VOLUM
    Il faut juste dans ce cas penser à ajouter une dernière écriture après la boucle de lecture pour la dernière rupture.

  7. #7
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Merci pour vos réponses, mais au fait le tri de bernard59139 à l'air de focntionner.

    Pouvez-vous m'expliquer la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    OUTREC OVERLAY=(46:46,9,ZD,DIV,+55)
    J'ai juste un petit souci car les champs que j'avais en colonne 56 à 64 ont été tronqués...

    Et les spaces qui se terminaient en colonne 54 se terminent maintenant en colonne 60

    Il y a juste la colonne volume ( de 65 à 70 qui elle n'a pas bougée)


    Merci encore pour votre aide.

  8. #8
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OUTREC OVERLAY=(46:46,9,ZD,DIV,+55)
    • OUTREC ...............=> reformatage du record
    • OVERLAY ..............=> en écrasant
    • 46: ......................=> la colonne 46 et suivantes
    • 46,9,ZD,DIV,+55 ....=> avec une zone commencant en 46, de longueur 9 en applicant une division par 55


    j'ai donné les Positions par rapport à un fichier avec le RECFM=FB, si le fichier est en VB, alors ajouter 4 aux positions.

    la longueur de la zone n'est peut être pas strictement exacte, à vérifier.

  9. #9
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour,

    je sui s effectivement en VB j'ai donc adapté le tri de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    SORT FIELDS=(5,44,CH,A)             
    SUM FIELDS=(50,9,ZD)                
    OUTREC OVERLAY=(50:50,9,ZD,DIV,+55)
    Et c'est avec ce code que j'ai le souci d'écrasement de donnée que j'explique au dessus....

  10. #10
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    SORT se réserve une place pour le signe, la nouvelle zone fait au moins 10 de long, avec un signe 'possible' en fin de zone.

    En voulant aller trop vite, j'avais oublié cette histoire de décalage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SORT FIELDS=(5,44,CH,A)
    SUM FIELDS=(50,9,ZD)
    OUTREC OVERLAY=(50:50,9,ZD,DIV,+55,EDIT=(IIIIIIIIT))
    Le EDIT permet de formater la nouvelle zone. Les 'I' traitent les zéro non significatifs, et "T" impose l'affichage d'un chiffre.

  11. #11
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Un grand merci.

    Ca marche Nickel !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. depassement de mémoire rich:extendedDataTable
    Par bousnguar dans le forum JSF
    Réponses: 1
    Dernier message: 01/06/2009, 11h31
  2. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  3. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo