2017-04-20 46 views
5

我需要一個理論上的答案。哪些統計信息在SAS,proc摘要中計算得更快?

想象一下,您擁有一個擁有15億行(使用DB2-Blu以列爲基礎創建的表)的表。

您正在使用SAS,並且您將通過Proc Summary使用Proc Summary進行一些統計,如最小/最大/平均值,標準偏差值和百分位-10,百分位數-90。例如,您有30.000個對等組,並且每個對等組中有50,000個值(總計15億個值)。

另一種情況下,您有300萬個對等組,同時每個對等組中有50個值。所以你總共有15億的價值。

如果您有較少的對等組,但每個對等組中的值更多,它會更快嗎?或者在更多對等組中使用更快,但每個對等組的數值會更少。

我可以測試第一個案例(每個對等組30,000個對等組和50.000個值),大約需要16分鐘。但我無法測試第二種情況。

如果我在每個對等組中有300萬個對等組和50個值,那麼您可以爲運行時編寫一個近似預測嗎?

該問題的另一個維度。如果我使用Proc SQL來代替這些統計數據,會更快嗎?

示例代碼如下:

proc summary data = table_blu missing chartype; 
    class var1 var2; /* Var1 and var2 are toghether peer-group */ 
    var values; 

    output out = stattable(rename = (_type_ = type) drop = _freq_) 
    n=n min=min max=max mean=mean std=std q1=q1 q3=q3 p10=p10 p90=p90 p95=p95 
; 
run; 
+0

是對數據由每組排序或對每個組的索引?你在使用「CLASS」還是「BY」語句? – DomPazz

+0

@DomPazz我們的系統管理員表示在DB2-Blu(基於列)中不需要建立索引,它本身具有某種智能解決方案。它確實比索引的基於行的錶快兩倍。 – user3714330

+0

@DomPazz我在'Proc Summary'中使用'Class' – user3714330

回答

4

所以有一些事情要考慮這裏。

性能方面的第一點和很可能最大的問題是將數據從DB2轉移到SAS。 (我假設這不是SAS中的數據庫實例 - 如果是這樣的話,請糾正我)。這是一個很大的桌子,在線上移動需要時間。因此,如果您可以使用SQL語句計算DB2內的所有這些統計信息,那可能是您最快的選擇。

因此,假設您已經下載了表格到SAS服務器:

CLASS變量名稱排序表將遠遠快於未排序的表來處理。如果SAS知道該表已排序,則不必掃描表中的記錄以進入組,則可以執行塊讀取而不是隨機IO。

如果表未分類,則組數越大,則需要進行更多的表掃描。

問題是,在未排序的過程中,從HD獲取數據到CPU的速度將是至關重要的。

從那裏,你進入內存和CPU問題。 PROC概要是多線程的,SAS將一次讀取N個組。如果組大小適合分配給該線程的內存,則不會有問題。如果組的大小太大,那麼SAS將不得不頁面。

我按比例縮小的問題至15M行例如:

%let grps=3000; 
%let pergrp=5000; 

UNSORTED:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 3001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   20.88 seconds 
     cpu time   31.71 seconds 

排序方法:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 3001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   5.44 seconds 
     cpu time   11.26 seconds 

========== ===================

%let grps=300000; 
%let pergrp=50; 

UNSORTED:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 300001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   19.26 seconds 
     cpu time   41.35 seconds 

排序方式:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 300001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   5.43 seconds 
     cpu time   10.09 seconds 

我跑這幾個時間和運行時間是相似的。排序時間大致相等,方式更快。

每組的組數越少/分組數越少未分類的速度越快,但看看總CPU使用率,它會更高。我的筆記本電腦的SSD速度非常快,所以IO可能不是限制因素 - HD能夠跟上多核CPU的需求。在HD較慢的系統上,總運行時間可能不同。

最後,它太依賴於數據的結構以及服務器和數據庫的細節。

2

不是一個理論的答案,但仍然具有現實意義IMO ......

爲了加快您的proc summary關於大表格的/ groupinternal選項添加到您的類的語句。當然,假設你不想在分組之前格式化變量。

e.g:

class age/groupinternal; 

這告訴SAS,它並不需要的格式值計算什麼類組值到之前提出申請。即使沒有明確指定,每個值都會應用一個格式。這對小桌子沒有太大的影響,但是在大桌子上可以。

從這個簡單的測試,它減少了從60秒的時間我的機器上爲40秒(YMMV):

data test; 
    set sashelp.class; 
    do i = 1 to 10000000; 
    output; 
    end; 
run; 

proc summary data=test noprint nway missing; 
    class age/groupinternal; 
    var height; 
    output out=smry mean=; 
run; 
+0

好的提示。有趣的是,在我的3000x5000未排序表的例子中,這減慢了處理速度。總CPU使用率較低,但總時間較長。努力理解原因。 – DomPazz