Se il set di dati è stato ordinato in precedenza dalle prime 2 variabili, quindi indipendentemente dalle informazioni sortedby
sul set di dati, SAS impiegherà meno tempo della CPU per ordinarlo *. Questa è una proprietà naturale degli algoritmi di ordinamento più decenti - è molto meno lavoro per ordinare qualcosa che è già quasi ordinato.
* Finché non si utilizza l'opzione force
nell'istruzione proc sort
, che impone di eseguire l'ordinamento ridondante.
Ecco un piccolo test mi sono imbattuto:
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;
I risultati rilevanti che ho ottenuto sono state le seguenti:
- SAS ha preso 8 secondi per ordinare l'originale set di dati del tutto indifferenziati da tutte le 3 variabili.
- SAS ha impiegato 4 secondi per ordinare per 3/3 a partire dal dataset della linea di base già ordinato per 2/3 variabili.
- SAS ha impiegato 4 secondi per ordinare per 3/3 a partire dallo stesso set di dati di riferimento dopo aver rimosso le informazioni di ordinamento da esso.
La metrica rilevante dall'output del registro è la quantità di tempo CPU utente.
Ovviamente, se il set di dati quasi ordinato è molto grande e contiene molte altre variabili, è possibile che si desideri evitare l'ordinamento a causa dell'overhead di scrittura durante la sua sostituzione. Un altro approccio che potreste adottare sarebbe quello di creare un indice composito - questo vi permetterebbe di fare cose che coinvolgono l'elaborazione di gruppo, per esempio.
/*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;
creazione di un indice richiede una lettura di tutto il set di dati, così come il tipo, ma solo una parte del lavoro svolto in forma scritta fuori di nuovo, e potrebbe essere più veloce di un 2/3 a 3/3 ordinare in alcune situazioni.
Dai un'occhiata all'opzione NOTSORTED per dichiarazione di gruppo, potrebbe essere d'aiuto, Esempio di esempio: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –
Ne hai bisogno per l'unione? –
Lo sto ordinando per mantenere la frequenza più comune all'interno di ogni coppia ID/Etichetta. – Nick