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

SAS Base Discussion :

Le traitement parallèle d'un programme


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Points : 22
    Points
    22
    Par défaut Le traitement parallèle d'un programme
    Bonsoir,

    Je suis à la recherche d'une façon d'améliorer le temps de run d'un macro - programme existant (extraction de données sur un serveur).
    Un exemple, si je souhaite extraire 3 mois de données, j'aurais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %extract_macro ( 
    tab_in  = data
    tab_out = ma_table
    debut   = 01/08/2016
    fin     = 31/10/2016
    );
    Ce bout de code, selon les périodes, procède mois par mois. Il extrait les données d'août puis celle de septembre et enfin celle d'octobre tout en utilisant la proc append à chaque étape pour les regrouper dans ma_table. Le point noir de ce mode de fonctionnement, c'est qu'il fait exactement la même chose mois par mois et que le temps de run peut être de plusieurs heures selon le nombre de période que je veux extraire.

    Je me demandais s'il était possible de plutôt procéder via un traitement parallèle.
    Au lieu d'une macro qui procède comme indiqué ci dessus, j'aimerais que le lancement de cette macro génère 3 sous - macros identiques où seuls les paramètres de debut et fin changeront pour chacune :

    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
    MACRO INITIALE :
    
    %extract_macro ( 
    tab_in  = data
    tab_out = ma_table
    debut   = 01/08/2016
    fin     = 31/10/2016
    );
    
    Cette macro génère les 3 macros suivantes, non pas à la suite mais parallèlement.
    
    %extract_macro ( 
    tab_in  = data
    tab_out = ma_table_1
    debut   = 01/08/2016
    fin     = 31/08/2016
    );
    
    %extract_macro ( 
    tab_in  = data
    tab_out = ma_table_2
    debut   = 01/09/2016
    fin     = 30/09/2016
    );
    
    %extract_macro ( 
    tab_in  = data
    tab_out = ma_table_3
    debut   = 01/10/2016
    fin     = 31/10/2016
    );
    
    Une fois que et seulement une fois que tout a tourné, est lancé le code suivant :
    
    data ma_table
       set ma_table_1  ma_table_2   ma_table_3; 
    run;
    Bref, un moyen de réduire le temps de run à un mois d'extraction seulement. Mais qui je m'en doute sera plus gourmand en mémoire. Si trop gourmand, ce sera ensuite à moi d'aviser de mon côté pour voir si l'on ne pourrait pas élargir à 3 mois au lieu d'un. Aussi, ce n'est qu'un exemple fictif et dont certaines choses seront à déclarer en amont (les dates par exemple selon celles de la macro initiale). L'automatisation ne me pose pas de soucis, c'est la parallélisation des tâches que je ne maîtrise absolument pas.

    Est - ce possible ? Si oui, de quelle façon et quelles sont les notions importantes à retenir pour une bonne parallélisation ?


    Merci,
    Mac_Leod.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Je te propose ce code en macro qui génère, à partir de ta macro %extract_macro, trois sous-macros en changeant aussi, à chaque fois, les valeurs prises par les trois paramètres : Tab_out, Debut et Fin.
    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
    %macro Dispach_Date (
    _tab_out =,
    _debut   =,
    _fin     =,	   ) ;
     
    %Do mois=%sysfunc(MONTH(&_debut.)) %TO %sysfunc(MONTH(&_fin.)) ; 
     
    %let tab_out=&_tab_out._&mois. ;
    %let debut=%sysfunc(MDY(&mois., 1, %sysfunc(YEAR(&_debut.))), ddmmyy10.) ; 	
    %let fin  =%sysfunc(intnx(MONTH,   %sysfunc(inputn(&debut., ddmmyy10.)), 0, end), ddmmyy10.) ; 
     
    %STR ( %extract_macro (
    tab_in  =data,
    tab_out =&_tab_out._&mois., 
    debut   =&debut,
    fin     =&fin    	) ;
         ) ;
     
    %End ;
    %mend ;   
     
    %Dispach_Date (
    _tab_out = ma_table,
    _debut   = "01Aug2016"d,
    _fin     = "31Oct2016"d
                   ) ;
    Tu nous dira si ce code te permettra de gagner en temps de traitement.
    NB : l'indice des tables en sortie est le nombre du mois 8, 9 et 10 au lieu de 1, 2 et 3.
    Bon courage
    Ward

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Désolé pour ma réponse tardive.

    J'ai regardé attentivement le code et celui - ci ne correspond pas exactement à ce que j'aimerais faire. C'est d'ailleurs ce que fait déjà ma macro d'extraction. Dans l'exemple, le programme boucle sur les mois d'août à octobre, mais j'aimerais qu'il fasse ces traitements en même temps.

    • Ce qu'il fait : Le mois d'août, puis le mois de septembre, puis le mois d'octobre.
    • Ce que j'aimerais : Le mois d'août et le mois de septembre et le mois d'octobre.


    C'est comme une punition où l'on doit recopier 100 fois une ligne, au lieu de l'écrire 100 fois, on fait en sorte d'écrire 2 ou 3 lignes en même temps avec des stylos qu'on scotche ensemble pour gagner du temps (paye ta métaphore ). Je ne sais pas si vous voyez la nuance ?

    J'ai légèrement modifié le code pour qu'il soit plus clair dans ma tête, il suffit d'une table data dans laquelle on a une variable "date" pour le lancer.

    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
    %macro _extract (tab_in =, tab_out =, debut =, fin =);
     
    	/* Macro d'extraction fictive */
    	data &tab_out.;
    		set &tab_in.;
    		if &debut. <= date <= &fin.;
    	run;
     
    %mend _extract;	
     
     
     
    %macro _dispatch(out, start, end);
     
     	/* Boucle sur chaque mois */
    	%do mois = %sysfunc(month(&start.)) %to %sysfunc(month(&end.)) ; 
     
    		/* Détermination de la période pour un mois donné */
    		%let _min = %sysfunc(mdy(&mois., 1, %sysfunc(year(&start.))), date9.) ; 	
    		%let _max = %sysfunc(intnx(month,   %sysfunc(inputn(&_min., date9.)), 0, end), date9.) ; 
     
    		 %_extract (  tab_in  = lib.trx  
    		 						, tab_out = &out._&mois.   
    		 						, debut   = "&_min."d 
    		 						, fin     = "&_max."d
    		 					 ); 
     
    		/* On append dans la table finale */					 
    		proc append base = &out. data = &out._&mois.; run;	
     
    	%end ;
     
    %mend _dispatch;   
     
    %_dispatch(ma_table, "01AUG2016"d, "31OCT2016"d);

  4. #4
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
     
    %macro test(debut=,fin=);
    data test (drop =i dif);
    format debut fin date9.;
    dif=intck('month',&debut.,&fin.);
    Do i=0 to dif;
    debut=intnx('month',&debut,i,'b');
    fin=intnx('month',debut,0,'e');
    mois=month(debut);
    annee=year(debut);
    output;
    end;
    run;
    %mend;
     
    %test(debut="01jan2016."d,fin="01dec2016."d);
     
    data test1;
    format date date9.;
    do date='01jan016'd to '01oct2017'd;
    mois=month(date);
    annee=year(date);
          output;
        end;
    run;
     
    data test2(keep=date);
    format date date9.;
       if _n_=1 then do;
         if 0 then set test;    
     
          dcl hash h1(dataset:'test');
          h1.defineKey('mois','annee');
          h1.definedata("debut","fin");
          h1.defineDone();  
      end;
     
      set test1;
      rc=h1.find();
      if debut<=date<=fin;
     
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Points : 22
    Points
    22
    Par défaut
    Bonsoir,

    Je n'ai aucun mal à comprendre ce que font les 2 premières étapes data. Mais j'avoue être un peu largué sur la construction de la troisième.

    De nombreuses notions me sont inconnues (dcl, hash, rc, etc ...) et j'ai du coup un peu de mal à voir en quoi cela répond à ma demande. Serait - ce possible des explications précises sur ce qui est fait à chaque étape ?


    Mac_Leod.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Je suis certain que la macro que j’ai proposé a crée trois sous-macros en respectant les dates début et Fin, paramètres de macro, pour chaque mois en répondant à ton exemple dans le cadrant #1. Il est normal que cette macro ne corresponde pas exactement à ce que t'aimerais faire car on ne connaissait pas le code de ta macro _extraction.

    Citation Envoyé par Mac_Leod Voir le message
    J'ai légèrement modifié le code pour qu'il soit plus clair dans ma tête, il suffit d'une table data dans laquelle on a une variable "date" pour le lancer.
    Le code repris et modifié est-il ou pas Le code attendu ?

Discussions similaires

  1. [SSIS] [2K5] Impacts des traitements parallèles
    Par gassisprog dans le forum SSIS
    Réponses: 3
    Dernier message: 04/03/2011, 14h55
  2. Stockage de données et traitement parallèle
    Par Carpe Dyemme dans le forum Simulink
    Réponses: 1
    Dernier message: 09/09/2010, 16h49
  3. [datastage] Boucle avec traitement parallèle
    Par blazDelParis dans le forum DataStage
    Réponses: 4
    Dernier message: 09/09/2010, 10h24
  4. realisation d'une execution parallèle d'un programme
    Par charouel dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/12/2009, 21h07
  5. Transaction et traitements parallèles
    Par jfphan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2004, 10h48

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