Jeśli wcześniej sortowałeś zestaw danych według pierwszych 2 zmiennych, to niezależnie od informacji o zestawie danych, sortedby
, SAS będzie potrzebował mniej czasu procesora, aby go posortować *. Jest to naturalna właściwość najbardziej przyzwoitych algorytmów sortowania - znacznie mniej pracy polega na sortowaniu czegoś, co jest już prawie posortowane.
* Dopóki nie użyjesz opcji force
w instrukcji proc sort
, która zmusza ją do wykonania nadmiarowego sortowania.
Oto mały test Pobiegłem:
option fullstimer;
/*Make sure we have plenty of rows with the same 1 + 2 values, so that sorting by 1 + 2 doesn't imply that the dataset is already sorted by 1 + 2 + 3*/
data test;
do _n_ = 1 to 10000000;
var1 = round(rand('uniform'),0.0001);
var2 = round(rand('uniform'),0.0001);
var3 = round(rand('uniform'),0.0001);
output;
end;
run;
/*Sort by all 3 vars at once*/
proc sort data = test out = sort_all;
by var1 var2 var3;
run;
/*Create a baseline dataset already sorted by 2/3 vars*/
/*N.B. proc sort adds sortedby information to the output dataset*/
proc sort data = test out = baseline;
by var1 var2;
run;
/*Sort baseline by all 3 vars*/
proc sort data = baseline out = sort_3a;
by var1 var2 var3;
run;
/*Remove sort information from baseline dataset (leaving the order of observations unchanged)*/
proc datasets lib = work nolist nodetails;
modify baseline (sortedby = _NULL_);
run;
quit;
/*Sort baseline dataset again*/
proc sort data = baseline out = sort_3b;
by var1 var2 var3;
run;
Odpowiednie wyniki dostałem były następujące:
- SAS wzięło 8 sekund do sortowania oryginalny całkowicie niesegregowanych zestawu danych przez wszystkich 3 zmiennych.
- SAS zajęło 4 sekundy, aby posortować wyniki o 3/3, począwszy od bazowego zestawu danych już posortowanego według zmiennych 2/3.
- SAS zajęło 4 sekundy, aby posortować wyniki o 3/3, począwszy od tego samego bazowego zestawu danych po usunięciu z niego informacji o sortowaniu.
Odpowiednią metryką z wyjścia logu jest czas procesora użytkownika.
Oczywiście, jeśli prawie posortowany zbiór danych jest bardzo duży i zawiera wiele innych zmiennych, możesz chcieć uniknąć sortowania z powodu napowietrznego zapisu podczas jego wymiany. Innym rozwiązaniem, które można zastosować, byłoby stworzenie indeksu złożonego - na przykład umożliwiłoby to wykonanie zadań związanych z przetwarzaniem grupowym.
/*Alternative option - index the 2/3 sorted dataset on all 3 vars rather than sorting it*/
proc datasets lib = work nolist nodetails;
/*Replace the sort information*/
modify baseline(sortedby = var1 var2);
run;
/*Create composite index*/
modify baseline;
index create index1 = (var1 var2 var3);
run;
quit;
Tworzenie indeksu wymaga lektury całego zbioru danych, podobnie jak rodzaj, ale tylko część pracy zaangażowanych w pisanie go ponownie, a może być szybsze niż 2/3 do 3/3 sortować w niektórych sytuacjach.
Spójrz na opcję NOTSORTED w instrukcji grupy, może to pomóc, na przykład: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –
Czy potrzebujesz go posortować do scalenia? –
Sortuję to, aby zachować najbardziej powszechną częstotliwość w obrębie każdej pary ID/etykiety. – Nick