L'exécution multi-thread d'une étape DATA en CAS permet une parallélisation automatique des opérations de traitement de données sur tous les nœuds disponibles du serveur CAS. Cela améliore considérablement les performances pour les grands ensembles de données. Le moteur CAS gère la distribution des données et la coordination des threads, rendant cette fonctionnalité transparente pour l'utilisateur dans la plupart des cas. L'option 'SINGLE=NO' n'est généralement pas requise car le multi-threading est le comportement par défaut pour les étapes DATA qui lisent et écrivent sur des tables CAS. L'exception principale est une étape DATA sans données d'entrée, qui s'exécute par défaut en un seul thread.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (datalines) ou la bibliothèque SASHELP.
1 Bloc de code
DATA STEP Data
Explication : Cet exemple illustre le comportement par défaut de l'étape DATA en CAS, qui est de s'exécuter en plusieurs threads. Tout d'abord, une table SAS de démonstration (sashelp.class) est chargée en mémoire CAS. Ensuite, une seconde étape DATA lit cette table CAS et écrit une nouvelle table CAS. La variable automatique `_NTHREADS_` est utilisée pour confirmer que l'étape DATA s'exécute bien en utilisant plusieurs threads.
Copié !
libname mycas cas;
/* Crée une table CAS à partir de sashelp.class */
data mycas.class_data;
set sashelp.class;
run;
/* Exécute une étape DATA multi-threadée sur la table CAS */
data mycas.class_processed;
set mycas.class_data;
/*_NTHREADS_ est une variable automatique qui affiche le nombre de threads*/
put 'Nombre de threads actifs : ' _nthreads_;
run;
1
LIBNAME mycas cas;
2
3
/* Crée une table CAS à partir de sashelp.class */
4
DATA mycas.class_data;
5
SET sashelp.class;
6
RUN;
7
8
/* Exécute une étape DATA multi-threadée sur la table CAS */
9
DATA mycas.class_processed;
10
SET mycas.class_data;
11
/*_NTHREADS_ est une variable automatique qui affiche le nombre de threads*/
12
put 'Nombre de threads actifs : ' _nthreads_;
13
RUN;
2 Bloc de code
DATA STEP Data
Explication : Cet exemple crée une petite table CAS directement à partir de 'datalines'. Ensuite, il effectue un calcul simple (Total_Valeur = Prix * Quantite) dans une étape DATA. L'option `single=no` est explicitement ajoutée à la table de sortie, bien que ce soit le comportement par défaut, pour souligner l'intention d'exécution multi-threadée. La variable `_NTHREADS_` confirme l'utilisation de plusieurs threads et montre le numéro de thread pour chaque observation traitée.
Copié !
libname mycas cas;
/* Création d'une table d'exemple dans CAS */
data mycas.produits;
input ID Produit $ Prix Quantite;
datalines;
1 Pomme 1.5 100
2 Poire 2.0 150
3 Banane 0.75 200
4 Orange 1.2 120
;
run;
/* Traitement multi-threadé avec calcul de la valeur totale */
data mycas.produits_valeur(single=no);
set mycas.produits;
Total_Valeur = Prix * Quantite;
put 'Traitement sur thread ' _nthreads_ ' pour ID ' ID;
run;
1
LIBNAME mycas cas;
2
3
/* Création d'une table d'exemple dans CAS */
4
DATA mycas.produits;
5
INPUT ID Produit $ Prix Quantite;
6
DATALINES;
7
1 Pomme 1.5100
8
2 Poire 2.0150
9
3 Banane 0.75200
10
4 Orange 1.2120
11
;
12
RUN;
13
14
/* Traitement multi-threadé avec calcul de la valeur totale */
15
DATA mycas.produits_valeur(single=no);
16
SET mycas.produits;
17
Total_Valeur = Prix * Quantite;
18
put 'Traitement sur thread ' _nthreads_ ' pour ID ' ID;
19
RUN;
3 Bloc de code
DATA STEP (MERGE) Data
Explication : Cet exemple avancé démontre une opération de jointure (MERGE) entre deux tables CAS ('employes' et 'salaires') en utilisant l'étape DATA multi-threadée. Le tri préalable par 'EmpID' est implicitement géré par CAS si les tables sont déjà triées ou si CAS peut l'optimiser. L'option `single=no` est utilisée pour confirmer le comportement multi-thread. Une vérification conditionnelle sur `_NTHREADS_` est ajoutée pour afficher si l'opération se déroule en multi-thread ou non, ce qui devrait être le cas ici.
Copié !
libname mycas cas;
/* Création de deux tables CAS pour la jointure */
data mycas.employes;
input EmpID Nom $ Departement $;
datalines;
101 Alice Ventes
102 Bob Marketing
103 Charlie Ventes
104 David IT
;
run;
data mycas.salaires;
input EmpID Salaire Annuel;
datalines;
101 60000
102 75000
103 62000
104 80000
;
run;
/* Jointure des tables en multi-threads */
data mycas.employes_complet (single=no);
merge mycas.employes mycas.salaires;
by EmpID;
if _nthreads_ > 1 then put 'Jointure en cours sur un thread multiple.';
else put 'Jointure en cours sur un seul thread.';
run;
1
LIBNAME mycas cas;
2
3
/* Création de deux tables CAS pour la jointure */
4
DATA mycas.employes;
5
INPUT EmpID Nom $ Departement $;
6
DATALINES;
7
101 Alice Ventes
8
102 Bob Marketing
9
103 Charlie Ventes
10
104 David IT
11
;
12
RUN;
13
14
DATA mycas.salaires;
15
INPUT EmpID Salaire Annuel;
16
DATALINES;
17
10160000
18
10275000
19
10362000
20
10480000
21
;
22
RUN;
23
24
/* Jointure des tables en multi-threads */
25
DATA mycas.employes_complet (single=no);
26
MERGE mycas.employes mycas.salaires;
27
BY EmpID;
28
IF _nthreads_ > 1THEN put 'Jointure en cours sur un thread multiple.';
29
ELSE put 'Jointure en cours sur un seul thread.';
30
RUN;
4 Bloc de code
PROC CAS / DATA STEP Data
Explication : Cet exemple illustre une intégration plus poussée avec l'environnement Viya/CAS. Il commence par s'assurer qu'une session CAS est active. Ensuite, il crée une table CAS avec un grand nombre d'observations pour mieux simuler un scénario de production où le multi-threading est essentiel. Une 'proc cas' est utilisée pour exécuter une action CAS ('simple.summary') afin de générer des statistiques descriptives, démontrant l'interaction entre les PROC CAS et les étapes DATA. Enfin, une étape DATA est exécutée en mode multi-threadé pour ajouter une colonne 'categorie' basée sur une condition, tout en affichant le thread de traitement pour chaque observation, confirmant l'exécution parallèle. Les options `casport` et `cashost` sont des placeholders et doivent être adaptés à l'environnement CAS de l'utilisateur.
Copié !
libname mycas cas;
/* Démarrer une session CAS si non déjà active (pour l'autonomie de l'exemple) */
/* Si une session est déjà active, cette étape sera ignorée ou signalée. */
options casport=5570 cashost='localhost'; /* Adaptez si votre configuration CAS est différente */
cas mycas;
/* Création d'une table temporaire en CAS avec des données plus volumineuses */
data mycas.donnees_large;
do i = 1 to 100000;
valeur1 = rand('Uniform');
valeur2 = i * 10;
output;
end;
run;
/* Utilisation d'une action CAS pour obtenir des statistiques, puis traitement DATA step multi-threadé */
proc cas;
loadactionset 'simple';
simple.summary result=summary_res /
table={name='donnees_large', caslib='mycas'}
inputs={'valeur1', 'valeur2'};
print summary_res;
run;
/* Traitement conditionnel et agrégation en multi-threads */
data mycas.resultat_agrege;
set mycas.donnees_large;
if valeur1 > 0.5 then categorie = 'Haute';
else categorie = 'Basse';
put 'Thread ' _nthreads_ ': Traitement de l''observation ' _n_;
run;
1
LIBNAME mycas cas;
2
3
/* Démarrer une session CAS si non déjà active (pour l'autonomie de l'exemple) */
4
/* Si une session est déjà active, cette étape sera ignorée ou signalée. */
5
options casport=5570 cashost='localhost'; /* Adaptez si votre configuration CAS est différente */
6
cas mycas;
7
8
/* Création d'une table temporaire en CAS avec des données plus volumineuses */
9
DATA mycas.donnees_large;
10
DO i = 1 to 100000;
11
valeur1 = rand('Uniform');
12
valeur2 = i * 10;
13
OUTPUT;
14
END;
15
RUN;
16
17
/* Utilisation d'une action CAS pour obtenir des statistiques, puis traitement DATA step multi-threadé */
18
PROC CAS;
19
LOADACTIONSET'simple';
20
SIMPLE.summary RESULT=summary_res /
21
TABLE={name='donnees_large', caslib='mycas'}
22
inputs={'valeur1', 'valeur2'};
23
PRINT summary_res;
24
RUN;
25
26
/* Traitement conditionnel et agrégation en multi-threads */
27
DATA mycas.resultat_agrege;
28
SET mycas.donnees_large;
29
IF valeur1 > 0.5THEN categorie = 'Haute';
30
ELSE categorie = 'Basse';
31
put 'Thread ' _nthreads_ ': Traitement de l''observation ' _n_;
32
RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.