Sortieren eines fast sortierten Datasets in SAS

8

Ich habe einen großen Datensatz in SAS, von dem ich weiß, dass er fast sortiert ist; Ich weiß, die ersten und zweiten Ebenen sind sortiert, aber die dritte Ebene ist nicht. Außerdem enthalten die erste und die zweite Ebene eine große Anzahl unterschiedlicher Werte, so dass es noch weniger wünschenswert ist, die ersten beiden Spalten erneut zu sortieren, wenn ich weiß, dass sie bereits in der richtigen Reihenfolge sind. Ein Beispiel für die Daten ist unten gezeigt:

%Vor%

Die Verwendung der Option "vorsortiert" bei einer Prozedursortierung scheint nur zu prüfen, ob die Daten für jeden Schlüssel sortiert sind, andernfalls wird eine vollständige Sortierung der Daten durchgeführt. Gibt es eine Möglichkeit, SAS mitzuteilen, dass die ersten beiden Spalten bereits sortiert sind?

    
Nick 25.11.2014, 16:15
quelle

1 Antwort

8

Wenn Sie das Dataset zuvor nach den ersten beiden Variablen sortiert haben, benötigt SAS unabhängig von der sortedby -Information des Datasets weniger CPU-Zeit, um es zu sortieren *. Dies ist eine natürliche Eigenschaft der meisten vernünftigen Sortieralgorithmen - es ist viel weniger Arbeit, etwas zu sortieren, das schon fast sortiert ist.

* Solange Sie die force -Option in der proc sort -Anweisung nicht verwenden, was eine redundante Sortierung erzwingt.

Hier ist ein kleiner Test, den ich ausgeführt habe:

%Vor%

Die relevanten Ergebnisse, die ich bekam, waren wie folgt:

  • SAS benötigte 8 Sekunden, um den ursprünglichen, unsortierten Datensatz nach allen 3 Variablen zu sortieren.
  • SAS benötigte 4 Sekunden, um nach 3/3 zu sortieren, beginnend mit dem Basisdatensatz, der bereits nach 2/3 Variablen sortiert war.
  • SAS brauchte 4 Sekunden, um nach dem Entfernen der Sortierinformationen aus dem gleichen Basisdatensatz nach 3/3 zu sortieren.

Die relevante Metrik aus der Protokollausgabe ist die Menge an Benutzer-CPU-Zeit.

Wenn das fast sortierte Dataset sehr groß ist und viele andere Variablen enthält, sollten Sie die Sortierung aufgrund des Schreibaufwands beim Ersetzen vermeiden. Ein anderer Ansatz, den Sie verwenden könnten, wäre einen zusammengesetzten Index zu erstellen - dies würde es Ihnen ermöglichen, Dinge zu tun, die zum Beispiel durch Gruppenverarbeitung geschehen.

%Vor%

Das Erstellen eines Indexes erfordert das Lesen des gesamten Datasets, genau wie die Sortierung, aber nur einen Bruchteil der Arbeit, die beim erneuten Schreiben benötigt wird, und ist in einigen Situationen möglicherweise schneller als eine 2/3 bis 3/3 Sortierung .

    
user667489 25.11.2014, 18:14
quelle

Tags und Links