Die Multi-Thread-Ausführung eines DATA Steps in CAS ermöglicht eine automatische Parallelisierung der Datenverarbeitungsoperationen auf allen verfügbaren Knoten des CAS-Servers. Dies verbessert die Leistung bei großen Datensätzen erheblich. Der CAS-Engine verwaltet die Datenverteilung und die Koordination der Threads, wodurch diese Funktionalität in den meisten Fällen für den Benutzer transparent ist. Die Option 'SINGLE=NO' ist normalerweise nicht erforderlich, da Multi-Threading das Standardverhalten für DATA Steps ist, die auf CAS-Tabellen lesen und schreiben. Die wichtigste Ausnahme ist ein DATA Step ohne Eingabedaten, der standardmäßig in einem einzigen Thread ausgeführt wird.
Datenanalyse
Type : CREATION_INTERNE
Die Beispiele verwenden generierte Daten (Datalines) oder die SASHELP-Bibliothek.
1 Codeblock
DATA STEP Data
Erklärung : Dieses Beispiel veranschaulicht das Standardverhalten des DATA Steps in CAS, nämlich die Ausführung in mehreren Threads. Zuerst wird eine SAS-Demotabelle (sashelp.class) in den CAS-Speicher geladen. Anschließend liest ein zweiter DATA Step diese CAS-Tabelle und schreibt eine neue CAS-Tabelle. Die automatische Variable `_NTHREADS_` wird verwendet, um zu bestätigen, dass der DATA Step tatsächlich mehrere Threads verwendet.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung : Dieses Beispiel erstellt eine kleine CAS-Tabelle direkt aus 'Datalines'. Anschließend wird eine einfache Berechnung (Gesamtwert = Preis * Menge) in einem DATA Step durchgeführt. Die Option `single=no` wird der Ausgabetabelle explizit hinzugefügt, obwohl dies das Standardverhalten ist, um die Absicht der Multi-Thread-Ausführung zu unterstreichen. Die Variable `_NTHREADS_` bestätigt die Verwendung mehrerer Threads und zeigt die Thread-Nummer für jede verarbeitete Beobachtung an.
Kopiert!
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 Codeblock
DATA STEP (MERGE) Data
Erklärung : Dieses fortgeschrittene Beispiel demonstriert eine Verknüpfungsoperation (MERGE) zwischen zwei CAS-Tabellen ('employes' und 'salaires') unter Verwendung des Multi-Thread-DATA Steps. Die vorherige Sortierung nach 'EmpID' wird von CAS implizit verwaltet, wenn die Tabellen bereits sortiert sind oder CAS dies optimieren kann. Die Option `single=no` wird verwendet, um das Multi-Thread-Verhalten zu bestätigen. Eine bedingte Überprüfung von `_NTHREADS_` wird hinzugefügt, um anzuzeigen, ob der Vorgang in mehreren Threads ausgeführt wird oder nicht, was hier der Fall sein sollte.
Kopiert!
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 Codeblock
PROC CAS / DATA STEP Data
Erklärung : Dieses Beispiel veranschaulicht eine tiefere Integration in die Viya/CAS-Umgebung. Es beginnt mit der Sicherstellung, dass eine CAS-Sitzung aktiv ist. Anschließend wird eine CAS-Tabelle mit einer großen Anzahl von Beobachtungen erstellt, um ein Produktionsszenario besser zu simulieren, in dem Multi-Threading unerlässlich ist. Eine 'proc cas' wird verwendet, um eine CAS-Aktion ('simple.summary') auszuführen und deskriptive Statistiken zu generieren, was die Interaktion zwischen PROC CAS und DATA Steps demonstriert. Schließlich wird ein DATA Step im Multi-Thread-Modus ausgeführt, um eine 'Kategorie'-Spalte basierend auf einer Bedingung hinzuzufügen, während gleichzeitig der Verarbeitungsthread für jede Beobachtung angezeigt wird, was die parallele Ausführung bestätigt. Die Optionen `casport` und `cashost` sind Platzhalter und müssen an die CAS-Umgebung des Benutzers angepasst werden.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.