Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Frequent Contributor
Beiträge: 109
Stop im DataStep

Hallo zusammen,

 

hier mal eine generelle Frage in die Runde:

 

Gelegentlich stoße ich bei verschiedenen Beispielen online auf die Variante, dass ein "Stop" im DataStep verwendet wird.

 

Beispiel:

data want;

[...]

  do until (eof);
    set have end=eof;
    [...]
    output;
  end;

/* nichts mehr im DataStep zu tun, also stop */
stop;

run;

Mich wundert dies immer, da das Resultat mit und ohne "stop" das gleiche ist.

 

Daher die Frage: Gibt es Unterschiede bei der internen Verarbeitung, je nachdem, ob so ein "stop" (wie im obigen Beispiel) gesetzt ist oder nicht?

Hat das Performance-Vorteile? Dient es eventuell nur der Leserlichkeit?

 

Besten Dank für Eure Hinweise und Gedanken dazu.

 

Schöne Grüße

Michael

Esteemed Advisor
Beiträge: 6.669
Betreff: Stop im DataStep

Wenn man in einem do until etwas tut, das den "natürlichen" Endezustand eines Data Steps herbeiführt (zB das angeführte do until eof), dann braucht es den stop nicht.

Wenn man aber eine Operation ausführt, bei der der data step am Ende keine seiner üblichen Ende-Konditionen hat, dann braucht man den stop, da man sonst eine Endlosschleife hat. Einige Endlosschleifen kann der Data Step selbst erkennen und automatisch abbrechen (mit WARNING oder NOTE im Log), viele aber nicht.

Ein Stop macht auch Sinn, wenn man nur was ermitteln will:

data _null_;
call symput('anzahl',put(anzahl,best.));
set have nobs=anzahl;
stop;
run;

und daher nur einen (Pseudo-)Durchlauf braucht; der Step oben funktioniert auch mit 0 Observations.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Trusted Advisor
Beiträge: 1.114
Betreff: Stop im DataStep

Hallo Michael,

 

auch in Fällen, in denen keine Endlosschleife zu befürchten und "das Resultat mit und ohne 'stop' das gleiche ist", kann es durchaus Performance-Vorteile haben, das STOP-Statement zu verwenden. In der Tat gibt es nämlich einen Unterschied in der internen Verarbeitung: Das STOP-Statement verhindert eine ggf. unnötige weitere Iteration des Datasteps.

 

In dem Beispiel mit der DO-UNTIL-Schleife würde ohne STOP der mit "[...]" abgekürzte Block vor der Schleife unnötigerweise ein zweites Mal ausgeführt. In diesem Block könnte z. B. die Deklaration eines Hash-Objekts stehen, in das (per dataset: '...') ein riesiges Dataset geladen wird -- mit entsprechendem Zeitaufwand. Die zweite Iteration des Datasteps würde sogar trotz bereits erfüllter Abbruchbedingung EOF=1 noch einmal in die DO-UNTIL-Schleife hineingehen (weil eine UNTIL-Bedingung ja erst am Fuß der Schleife geprüft wird). Erst der Versuch, mit dem SET-Statement über das Ende des bereits abgearbeiteten Datasets HAVE hinaus zu lesen, würde den Datastep beenden.

 

Wenn man an den interessierenden Stellen (vor der Schleife, in der Schleife vor und nach dem SET-Statement, nach der Schleife) testweise PUT-Statements einbaut (z. B. put 'vor der Schleife:' _n_=;) oder die entsprechenden Codeteile sowieso etwas ins Log schreiben (wie etwa im Beispiel der Deklaration inkl. Befüllung eines Hash-Objekts), kann man im Log den Unterschied zwischen den internen Abläufen mit und ohne STOP deutlich sehen.

 

Viele Grüße

 

Reinhard

Frequent Contributor
Beiträge: 109
Betreff: Stop im DataStep
[ Bearbeitet ]

Hallo Kurt,

hallo Reinhard,

 

vielen Dank für Eure Rückmeldungen.

Ich finde es sehr spannend sich auch mal solche Basisthemen anzuschauen, die man doch über die Jahre nicht mehr beachtet. Wobei hier die korrekte Vorgehensweise durchaus einen Unterschied in der täglichen Arbeit machen kann. Eure Tipps sind daher sehr hilfreich für mich.

Hashes habe ich bisher immer mit "if _n_ = 1" umklammert, daher ist mir das bisher nie groß aufgefallen - ich habe die Thematik eher zufällig bemerkt.

 

Ergänzend zum Thema oben:

Kann man sagen, dass ein Data Step einen erneuten Durchlauf startet, wenn das RUN-Statement (ohne vorheriges Stop) erreicht wird und im Data Step ein SET-Statement auftaucht (egal, an welcher Stelle)?

 

Das würde ich aus den beiden folgenden Beispielen folgern:

/* kein Loop */
data want;
a = 5;
run;

/* Loop im Log */
data want;
if 0 then set have;
run;

Vermutlich habe ich das auch schonmal in einer SAS-Schulung gehört und nach ein paar Jahren dann einfach wieder vergessen. Verlegener Smiley

Insofern ist das vielleicht eine Basis-Frage, ich bin mir jedoch nicht zu schade dafür, das hier mal zu fragen. Vielleicht liest das auch noch der eine oder andere Interessierte aus der Community mit und freut sich über den Denkanstoß.

 

Herzliche Grüße

Michael

Esteemed Advisor
Beiträge: 6.669
Betreff: Stop im DataStep

mfab schrieb:

Hallo Kurt,

hallo Reinhard,

 

vielen Dank für Eure Rückmeldungen.

Ich finde es sehr spannend sich auch mal solche Basisthemen anzuschauen, die man doch über die Jahre nicht mehr beachtet. Wobei hier die korrekte Vorgehensweise durchaus einen Unterschied in der täglichen Arbeit machen kann. Eure Tipps sind daher sehr hilfreich für mich.

Hashes habe ich bisher immer mit "if _n_ = 1" umklammert, daher ist mir das bisher nie groß aufgefallen - ich habe die Thematik eher zufällig bemerkt.

 

Ergänzend zum Thema oben:

Kann man sagen, dass ein Data Step einen erneuten Durchlauf startet, wenn das RUN-Statement (ohne vorheriges Stop) erreicht wird und im Data Step ein SET-Statement auftaucht (egal, an welcher Stelle)?

 

Das würde ich aus den beiden folgenden Beispielen folgern:

/* kein Loop */
data want;
a = 5;
run;

/* Loop im Log */
data want;
if 0 then set have;
run;

Vermutlich habe ich das auch schonmal in einer SAS-Schulung gehört und nach ein paar Jahren dann einfach wieder vergessen. Verlegener Smiley

Insofern ist das vielleicht eine Basis-Frage, ich bin mir jedoch nicht zu schade dafür, das hier mal zu fragen. Vielleicht liest das auch noch der eine oder andere Interessierte aus der Community mit und freut sich über den Denkanstoß.

 

Herzliche Grüße

Michael


Genau. Mit dem set hat der data step eine mögliche EOF-Kondition, die er zum Beenden verwenden kann. Ohne set ist nach einem Durchlauf sowieso Schluss.

Wenn jetzt aber aus irgendwelchen Gründen das EOF nie kommt (zB man liest mit point=), dann ist das stop wichtig.

Ebenso wie set wirkt auch ein input-Statement, nur ist bei Infiles der sequentielle Durchlauf und damit das EOF quasi garantiert,

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers