LesezeichenAbonnierenRSS-Feed abonnieren
mfab
Quartz | Level 8

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

4 ANTWORTEN 4
Kurt_Bremser
Super User

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.

FreelanceReinh
Jade | Level 19

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

mfab
Quartz | Level 8

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

Kurt_Bremser
Super User

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,

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

Diskussionsstatistiken
  • 4 Antworten
  • 1487 Aufrufe
  • 0 Kudos
  • 3 in Unterhaltung