Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine
Aucun utilisateur

-17%
Le deal à ne pas rater :
Casque de réalité virtuelle Meta Quest 2 128 Go Blanc (+29,99€ ...
249.99 € 299.99 €
Voir le deal

Traitement parallèle d'un programme

3 participants

Aller en bas

Traitement parallèle d'un programme Empty Traitement parallèle d'un programme

Message par Mac_Leod Dim 6 Nov 2016 - 4:36

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:
%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:
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.

Mac_Leod

Nombre de messages : 28
Date d'inscription : 25/06/2015

Revenir en haut Aller en bas

Traitement parallèle d'un programme Empty Re: Traitement parallèle d'un programme

Message par Mac_Leod Mer 16 Nov 2016 - 8:43

Bonjour,

Je me permet de relancer le sujet qui est toujours d'actu de mon côté. Et je vous rassure, ma question ne mange pas, des pistes de réflexions seraient aussi très appréciables ! En guise de métaphore, ce serait 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 Smile

Voici un bout de code exemple, il suffit d'une table "data" contenant une variable "date" pour le lancer.

Code:
%macro _extract (tab_in =, tab_out =, debut =, fin =);
 
 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);

Ce code boucle sur les mois d'août à octobre (août PUIS septembre PUIS octobre) mais je voudrais qu'il fasse ces 3 mois en parallèle (août ET septembre ET octobre). Je ne sais pas si vous voyez la nuance.

Mac_Leod

Nombre de messages : 28
Date d'inscription : 25/06/2015

Revenir en haut Aller en bas

Traitement parallèle d'un programme Empty Re: Traitement parallèle d'un programme

Message par niaboc Mer 16 Nov 2016 - 11:50

Bonjour,

ce document pourra peut-être t'aider :

https://www.sas.com/offices/europe/france/services/support/doc_techniques/Process_CONNECT.pdf

Re-dis moi si c'est le cas!

Niaboc
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Traitement parallèle d'un programme Empty Re: Traitement parallèle d'un programme

Message par joyeux_lapin13 Jeu 17 Nov 2016 - 13:25

Franchement la parallélisation sous SAS est autant compliqué que ce qu'elle est facile sous R...

Déjà il va falloir que tu sois sur d'avoir le module MP connect, rien que là c'est pas gagner. Ensuite il faut voir avec ton admin réseau qu'il te file les droits. Et après bon courage pour la gueule du code... il faut créer les sessions filles, allouer le fichier de config paramétré par l'admin, paramétré pour SAS la gestion l'articulation de la parallélisation, charger dans chaque session fille les macros annexe, lui indiquer les fichiers à ré-assembler... bref un bordel sans nom.

Tu as plus vite fait de te lancer sous R qui fait quasiment tout tout seul.

Bon courage sinon.
joyeux_lapin13
joyeux_lapin13

Nombre de messages : 1927
Age : 40
Localisation : Mayotte
Date d'inscription : 21/04/2010

https://lemakistatheux.wordpress.com/

Revenir en haut Aller en bas

Traitement parallèle d'un programme Empty Re: Traitement parallèle d'un programme

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum