Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/06/2011, 19h32   #1
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Par défaut Durée d'execution d'un programme

Bonjour,

En tenant compte de nombre de variables, est-il normal qu'une execution d'un programme SAS dure plus q'une journée?? sachant que ça marche bien sans aucune erreur dans LOG, ainsi que des resultats satisfaisants.

Pour utiliser l'option BUFNO=, comment choisir le nombre aprés l' =???
y a-t-il d'autres façons d'optimisation??
Merci d'avance.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 08h49   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Citation:
Envoyé par Imfafa Voir le message
En tenant compte de nombre de variables, est-il normal qu'une execution d'un programme SAS dure plus q'une journée?? .
Bonjour;

Oui et non , car sa dépend de plusieurs choses :

Travailles-tu sur un server ou en session client.
DE la puissance de ta machine ( resources : RAM,CPU,…).
Type et taille et nombre de données (tables et fichiers en entrée).
Opérations effectuées (type de transformations, jointures, tris,…).
Ton programme est t’il optimisé ou non ?
Fais-tu des filtres sur les tables avant de faire les rapprochements entres elles,s’il y a lieu. ?
Crées-tu des index pour optimiser les traitements ?
. . .et pleins d’autres choses.
Donc donnes nous un peu plus de détails pour qu’on essaie de t’aider.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/06/2011, 09h20   #3
Membre habitué
 
Femme Géraldine CADE DESCHAMPS
Support Clients SAS (France et Europe)
Inscription : février 2010
Messages : 62
Détails du profil
Informations personnelles :
Nom : Femme Géraldine CADE DESCHAMPS
Localisation : France

Informations professionnelles :
Activité : Support Clients SAS (France et Europe)
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 62
Points : 139
Points : 139
Bonjour,

Sam a raison !

J'ajouterai juste ceci :
- la doc en ligne donne le B A BA de l'optimisation : http://support.sas.com/documentation...tm#perform.htm

- Le sujet est vaste, et est traité dans pas mal de doc sur le site de SAS.
* Un excellent document écrit par un maître du sujet : How to Maintain Happy SAS®Users
* Il date un peu mais j'aime bien celui-là qui parle des bases :
A Practical Approach to Solving Performance Problems with the SAS System

- la manière de coder joue un rôle essentiel dans les temps des traitements :
* De manière générale, étape data et proc sont plus performantes que la proc sql
* les indexes sont bénéfiques seulement s'ils sont bien choisis et utilisés à bon excient, sinon ils détériorent les perf
* un WHERE diminue les temps de traitements par rapport à un IF

Géraldine Cade-Deschamps
Géraldine_Cade_SAS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/06/2011, 14h45   #4
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
La macro en question ne contient ni PROC SQL ni PROC SORT.
Et franchement je sais pas faire les filtres sur tables dont vous parler, mais j'ai une idée sur les index qu'ils ne se faient qu'avec le PROC SQL!! n'est-il pas vrai???
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 14h56   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Il faut poster ton code.
si t'as des boucles non fermées c'est claire que le programme ne s'arrêtera pas.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h00   #6
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Voilà mon code:
Code :
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
%macro test();
%do i=1 %TO 21767;
Proc REG DATA=BIB1.SERIE outest=BIB1.test&i mse sse;  
model col&i=date;
run;
DATA BIB1.test&i;
SET BIB1.test&i;
    SST=_SSE_/(1-_RSQ_);
    SSM=SST-_SSE_;
    MSM=SSM/_IN_;
    F=MSM/_MSE_;
    pvalue=1-probf(F,_IN_,_EDF_);
run; 
DATA BIB1.test&i; SET BIB1.test&i (keep=pvalue); CLE=1; RUN;
DATA BIB1.TAB; SET BIB1.SERIE(keep=COL&i); CLE=1; RUN; 
DATA BIB1.TAB; MERGE BIB1.TAB BIB1.test&i; BY CLE; DROP CLE; RUN; 
DATA BIB1.tab1  BIB1.tab2; 
SET BIB1.TAB;
IF (pvalue <=0.05) THEN OUTPUT BIB1.tab2 ;
ELSE OUTPUT BIB1.tab1 ;
DROP pvalue;
RUN;
DATA BIB1.T; SET BIB1.T; CLE1=1;run;
DATA BIB1.nT; SET BIB1.nT; CLE1=1;run;
DATA BIB1.tab1; SET BIB1.tab1; CLE1=1; run;
DATA BIB1.tab2; SET  BIB1.tab2; CLE1=1; run;
DATA BIB1.T; merge  BIB1.T BIB1.tab1; BY CLE1; DROP CLE1; run;
DATA BIB1.nT; merge BIB1.nT BIB1.tab2; BY CLE1; DROP CLE1; run;
%end;
%mend;  
%test();
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h15   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu as donc 21767 variables à expliquer, c'est normal que ça soit aussi long.
Juste par curiosité, c'est quoi l'intérêt?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h16   #8
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Très bien;
Pour commencer tu dis: sachant que ça marche bien sans aucune erreur dans LOG, ainsi que des resultats satisfaisants. oui pas d'erreurs mais sa ne veut pas dire que la maco est juste. Dans cette marco tu repètes les mêmes opérations sur la même table. ce qui veut dire 500 fois.

Code :
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
 
%macro test();
%do i=1500 %TO 2000;
Proc REG DATA=BIB1.SERIE outest=BIB1.test&i mse sse;  
model col&i=date;
run;
 
DATA BIB1.test&i;
SET BIB1.test&i;
    SST=_SSE_/(1-_RSQ_);
    SSM=SST-_SSE_;
    MSM=SSM/_IN_;
    F=MSM/_MSE_;
    pvalue=1-probf(F,_IN_,_EDF_);
run; 
DATA BIB1.test&i; SET BIB1.test&i (keep=pvalue); CLE=1; RUN;
DATA BIB1.TAB /*ici tu crées une seule table et c'est la dernière qui est retenue*/; SET BIB1.SERIE(keep=COL&i); CLE=1; RUN; 
DATA BIB1.TAB/*ici tu crées une seule table et c'est la dernière qui est retenue*/; MERGE BIB1.TAB BIB1.test&i; BY CLE; DROP CLE; RUN; 
DATA BIB1.tab1  BIB1.tab2; /*ici tu crées deux  tables et c'est les dernières qui sont  retenues*/
SET BIB1.TAB;
IF (pvalue <=0.05) THEN OUTPUT BIB1.tab2 ;
ELSE OUTPUT BIB1.tab1 ;
DROP pvalue;
RUN;
/* à partir d'ici je ne voie pas pourquoi tu les inclues dans la boucle, et la même remarque tu crées la même table 500 fois*/
DATA BIB1.T; SET BIB1.T; CLE1=1;run;
DATA BIB1.nT; SET BIB1.nT; CLE1=1;run;
DATA BIB1.tab1; SET BIB1.tab1; CLE1=1; run;
DATA BIB1.tab2; SET  BIB1.tab2; CLE1=1; run;
DATA BIB1.T; merge  BIB1.T BIB1.tab1; BY CLE1; DROP CLE1; run;
DATA BIB1.nT; merge BIB1.nT BIB1.tab2; BY CLE1; DROP CLE1; run;
%end;
%mend;  
%test();
je ne sais pas ce que tu veux faire au juste mais ton programme est à revoir car il est faux
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h35   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
oups !!! je n'ai pas vu que t'as modifié ton programme,dans l'état normal c-à-d dans le cas où le programme est juste cette boucle
est énorme. et ce temps de traitement est normal.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h01   #10
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Je suis vraiment dé so lée, je t'ai donné la copie non corrigé:
voilà le nv:

Code :
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
%macro test();
%do i=1 %TO 21767;
Proc REG DATA=BIB1.SERIE outest=BIB1.test&i mse sse;  
model col&i=date;
run;
DATA BIB1.test&i;
SET BIB1.test&i;
    SST=_SSE_/(1-_RSQ_);
    SSM=SST-_SSE_;
    MSM=SSM/_IN_;
    F=MSM/_MSE_;
    pvalue=1-probf(F,_IN_,_EDF_);
run; 
DATA BIB1.test&i; SET BIB1.test&i (keep=pvalue); CLE=1; RUN;
DATA BIB1.TAB; SET BIB1.SERIE(keep=COL&i); CLE=1; RUN; 
DATA BIB1.TAB; MERGE BIB1.TAB BIB1.test&i; BY CLE; DROP CLE; RUN; 
DATA BIB1.tab1  BIB1.tab2; 
CLE1=1;
SET BIB1.TAB;
IF (pvalue <=0.05) THEN OUTPUT BIB1.tab2 ;
ELSE OUTPUT BIB1.tab1 ;
DROP pvalue;
RUN;
DATA BIB1.T; merge  BIB1.T BIB1.tab1; BY CLE1; run;
DATA BIB1.nT; merge BIB1.nT BIB1.tab2; BY CLE1;run;
%end;
%mend;  
%test();
Et concernant la premiere remarque: j'ai besoin à chaque etiration de nouvelles tables TAB, TAB1 et TAB2. TAB contient la colonne à tester.

D'autres fautes????,
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h27   #11
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Citation:
Envoyé par s_a_m Voir le message
dans l'état normal c-à-d dans le cas où le programme est juste cette boucle est énorme. et ce temps de traitement est normal.
on peut pas optimiser???
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h12   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Une boucle avec 21767 itérations, c'est énorme, ajoutons à sa des table qui contiennent apparemment jusqu’à 21767 colonnes (col&i).
et puis il y a des anomalies dans ton programme.
ici par exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
DATA BIB1.TAB; SET BIB1.SERIE(keep=COL&i); CLE=1; RUN; 
DATA BIB1.TAB; MERGE BIB1.TAB BIB1.test&i; BY CLE; DROP CLE; RUN; 
DATA BIB1.tab1  BIB1.tab2; 
CLE1=1;
SET BIB1.TAB;
IF (pvalue <=0.05) THEN OUTPUT BIB1.tab2 ;
ELSE OUTPUT BIB1.tab1 ;
DROP pvalue;
RUN;
DATA BIB1.T; merge  BIB1.T BIB1.tab1; BY CLE1; run;
DATA BIB1.nT; merge BIB1.nT BIB1.tab2; BY CLE1;run;
C’est le résultat de la dernière itération (21767)qui est retenu. BIB1.T,BIB1.nT
sont recréées à chaque itération et elles écrase la table résultante de l'itération précédente.

Oui on peut proposer des solutions d'optimisation si on saura ce que tu veux faire réellement.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h42.


 
 
 
 
Partenaires

Hébergement Web