2017-04-20 33 views
5

私は理論的な答えが必要です。どの統計情報がSAS、proc summaryでより高速に計算されますか?

15億行のテーブルがあるとします(テーブルはDB2-Bluで列ベースとして作成されます)。

あなたはSASを使用しており、ピアグループを介して最小/最大/平均値、標準偏差値、パーセンタイル-10、パーセンタイル-90などのProc Summaryを使用して統計を行います。

たとえば、30,000のピアグループがあり、各ピアグループに50,000の値があります(合計1.5億の値)。

他のケースでは、300万のピアグループがあり、各ピアグループに50個の値があります。したがって、合計15億の価値が再びあります。

ピアグループは少なくても、各ピアグループに値が多くなるほど速くなりますか?それとも、より多くのピアグループでは速くなりますが、各ピアグループではより少ない値になります。

私は最初のケース(ピアグループごとに30.000のピアグループと50.000の値)をテストすることができ、およそ16分かかりました。しかし、私は2番目のケースをテストすることはできません。

私は3百万のピアグループと各ピアグループに50の値を持っている場合に、実行時におおよその予兆を書くことができますか?

質問のもう1つの次元。代わりに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(列ベース)でインデックスを作成する必要はないと言っています。実際には、索引付けされた行ベースの表よりも2倍高速でした。 – user3714330

+0

@DomPazz私は 'Proc Summary'で' Class'を使用しています。 – user3714330

答えて

4

ので、ここで考えるべき事の数があります。

最初の点は、パフォーマンス面ではおそらくDB2からSASにデータを取得することです。 (私はこれがSASのデータベースインスタンスではないと仮定しています - もしあれば正解)。それは大きなテーブルなので、電線の向こう側に移動するには時間がかかります。そのため、SQL文を使用してDB2内のこれらの統計をすべて計算することができれば、おそらく最速のオプションになります。

ですから、SASサーバーにテーブルをダウンロードしたと仮定すると:

CLASS変数でソートされたテーブルがソートされていないテーブルよりも処理がはるかに速くなります。 SASがテーブルがソートされていることが分かっている場合、レコードがグループに入るようにテーブルをスキャンする必要はなく、ランダムIOではなくブロック読み取りを実行できます。

テーブルがソートされていない場合は、グループの数が多いほど、より多くのテーブルスキャンが発生する必要があります。

重要なのは、HDからCPUへのデータを取得する速度が、並べ替えられていないプロセスで最も重要なことです。

そこから、メモリとCPUの問題が発生します。 PROC SUMMARYはマルチスレッド化されており、SASは一度にN個のグループを読み込みます。グループサイズがそのスレッドに割り当てられたメモリに収まる場合、問題は発生しません。グループのサイズが大きすぎる場合、SASはページングする必要があります。

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

UNSORTED:SORTED

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 

==========

私は15M行例に問題を縮小しました===================

%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 

SORTED:

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のシステムでは、合計実行時間が異なる場合があります。

最終的には、データがどのように構造化されているか、サーバーとDBの詳細には多すぎます。

2

ない理論的な答えが、まだ関連IMO ...大きなテーブルの上にあなたのproc summaryをスピードアップするため

は、あなたのクラスステートメントに/ groupinternalオプションを追加します。もちろん、グループ化する前に変数をフォーマットしたくないと仮定します。

例えば:

class age/groupinternal; 

これは、前にグループにどのようなクラスの値を計算した値に書式を適用する必要はありませんSASを伝えます。明示的に指定していない場合でも、すべての値に適用される書式があります。これは小さなテーブルでは大きな違いはありませんが、大きなテーブルではそれが可能です。

この簡単なテストから、それは40秒(メーリングリスト)に私のマシンで60秒からの時間を短縮:

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

関連する問題