Veri kümesini daha önce ilk 2 değişkene göre sıraladıysanız, daha sonra veri kümesindeki sortedby
bilgisinden bağımsız olarak, SAS bunu çözmek için daha az CPU süresi alır *. Bu, en iyi sıralama algoritmalarının doğal bir özelliğidir - zaten neredeyse sıralanan bir şeyi sıralamak için çok daha az iş var.
* proc sort
deyiminde force
seçeneğini kullanmadığınız sürece, bunu gereksiz sıralamaya zorlar.
İşte koştum küçük bir test var:
- SAS 3 değişkenlerin orijinal tamamen sıralanmamış veri kümesini sıralamak için 8 saniye sürdü şu şekildedir: bende
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;
ilgili sonuçlar vardı.
- SAS, 2/3 değişkenleri tarafından sıralanmış olan başlangıç veri kümesinden başlayarak 3/3 sıralamak için 4 saniye sürdü.
- SAS, sıralama bilgilerini kaldırdıktan sonra aynı temel veri kümesinden başlayarak 3/3 sıralamak için 4 saniye sürdü.
Günlük çıktısından ilgili metrik, kullanıcı CPU zamanının miktarıdır.
Şüphesiz, hemen hemen ayrılmış veri kümesi çok büyük ve çok sayıda başka değişken içeriyorsa, bunu değiştirirken yazma ek yükü nedeniyle sıralamadan kaçınmak isteyebilirsiniz. Yapabileceğiniz başka bir yaklaşım, birleşik bir dizin oluşturmak olabilir - bu, örneğin, grup işlemeye dahil olan şeyleri yapmanıza izin verir. bir dizin oluşturma
/*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;
, bütün veri kümesinin bir okuma gerektirir tür, ama tekrar dışarı yazılı olarak katılan işin yalnızca bir kısmını yapar ve 2/3 3/3 kadar daha hızlı olabilir olarak bazı durumlarda sırala.
Grup bildirimi tarafından NOTSORTED seçeneğine bir göz atın, yardımcı olabilir, Örnek: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –
Birleştirme için ayrıştırmaya mı ihtiyacınız var? –
Her bir Kimlik/Etiket çiftinde en yaygın sıklığı korumak için sıralıyorum. – Nick