SAS Remote und parallel

Aus BI-Snippets - Business Intelligence Code und Module
Wechseln zu: Navigation, Suche
Dies ist ein Beispiel-Code, um unter Verwendung von SAS/CONNECT und RSUBMIT eine parallele Verarbeitung von Daten auf einer entfernten Maschine aufzubauen. Ein großes Eingabedatenset muss vor dieser Verarbeitung idealerweise in n gleich große Teile geteilt werden. Je nach Art der Verarbeitung bietet sich eine einfache Teilung nach n/4 (4 in diesem Beispiel) oder eine zufällige Teilung an.

RSUBMIT könnte auch ohne Netzwerk-Verbindung (siehe Kommentar bei SIGNON) zu einem Remote-Server verwendet werden, so dass man auf dem SAS-Base-Rechner, auf dem das Script läuft, mehrere Prozesse starten kann, um von mehreren Kernen des Systems zu profitieren. 

Vor einer Parallelisierung ist zu untersuchen, ob der IO-Overhead des Zerteilens und Re-integrierens der zu verarbeitenden Daten evtl. die CPU-Vorteile einer Parallelverarbeitung überwiegt.
<syntaxhighlight lang="SAS" line="1" >%LET BENUTZER=SASUSER;

%LET T_PASSWORD=SASPW;


/* Anlegen einer lib im lokalen Prozess */ LIBNAME REMLIB "PATH";

%MACRO HOSTWORK; /* Setzen des remote-SAS Servers */

 %DO I=1 %TO 4;
   /* Setzen von Server Hostname und Port
      Anmelden und mit Verbindungs-ID versehen */
   %LET TASK&I.=SASSERVER.COMPANY.NET 1234;
   SIGNON TASK&I. USER=&BENUTZER. PASSWORD="&T_PASSWORD.";

/* Alternativ ohne Netzwerk auf lokalem Rechner:

   options autosignon sascmd='!sascmd ' 

REMOTE=TASK&i.;

  • /
 %END;


 %DO I=1 %TO 4;
   /* Setzen einer Makrovariable im Remote-Prozess */
   %SYSLPUT ZAEHLER=&I. /REMOTE=TASK&I.;  

/* Übertragen des Codes. Verwendung von %NRSTR

 um Makroexpansion im lokalen Prozess zu verhindern. Der Code wird
 zu dem in TASK&I. definierten Server geschickt. */

/* Die REMLIB des lokalen Prozess wird dem remote Prozess

 zur Verfügung gestellt */
   RSUBMIT TASK&I. WAIT=NO PERSIST=NO INHERITLIB=(REMLIB);

%NRSTR(

   /* Erstellen einer Test-Datei */

DATA REMLIB.TEST&ZAEHLER.;

A = &ZAEHLER;

RUN; );

   /* Ende des Remote-ausgeführten Codes */
   ENDRSUBMIT;
 %END;
 /* Alle Tasks parallel ausführen und warten, bis der
    letzte Task abgeschlossen ist */
 WAITFOR _ALL_ %DO I=1 %TO 4; TASK&I. %END;;

%MEND HOSTWORK;

%HOSTWORK;

/* F:\TEMP\ enthält nun TEST1.SAS7BDAT - TEST4.SAS7BDAT */</syntaxhighlight>