投稿

ラベル(処理時間)が付いた投稿を表示しています

whereステートメントで処理時間を遅くする書き方 ~年月でオブザベーションを絞り込む~ - SAS

年月でオブザベーションを絞り込む方法について質問を受けたとき、処理効率の話になったので、その話をまとめてみました。 オブザベーションを条件式で絞り込む方法には、whereステートメントとサブセット化 ifステートメントがあります。基本的には、whereを使ったほうが処理速度が早いのですが、書き方によっては if 並に遅くなってしまいます。 下記に、2015年6月のデータのみに絞り込むための 5つのサンプルパターンを作成しました。 年月で絞り込むテストコード options lognumberformat ; /* ログのオブザベーション数にカンマを付ける */ /* テストデータ */ data TEST ; format DT yymmdds10. ; do I=1 to 100000000 ; /* 1億 */ /* 2015/01/01 から 365日間のいずれかのSAS日付を項目 DT に格納します */ DT = mdy(01, 01, 2015) + int(365 * ranuni(1)) ; output ; end ; run ; /* 2015年6月に絞り込むためのマクロ変数を定義します */ %let TARGET_MONTH = %sysfunc(mdy(6, 1, 2015)) ; %let TARGET_YYYY = %sysfunc(year(&TARGET_MONTH.)) ; %let TARGET_MM = %sysfunc(month(&TARGET_MONTH.)) ; %put &=TARGET_MONTH. ; %put &=TARGET_YYYY. ; %put &=TARGET_MM. ; /* intnx関数から来月の月初を算出して、絞り込む */ data TEST1 ; set TEST ; where &TARGET_MONTH. <= DT < intnx('MONTH', &TARGET_MONTH., 1, 'BEGINNING') ; run ; /* intnx関数から今月の月末を算出して、絞り込む */ data ...

プログラムの処理時間を計測したい - SAS

イメージ
SASプログラムの処理時間は、1つのdataステップやプロシージャ単位でログに表示されるのだけど、複数ステップの合計処理時間を取得したい、プログラム全体の処理時間を知りたいとかあるかと思います。処理時間を計測するためには、現在の日時を取得する datetime関数を用いることで計測することができます。 処理時間を計測するテストコード /* 処理時間を計測したい処理直前の日時をマクロ変数 START_TIME に格納 */ data _null_ ; call symputx('START_TIME', datetime()) ; run ; /* 処理を計測したいサンプルコード */ data TEST1 ; do I=1 to 10000000 ; R = ranuni(1) ; output ; end ; run ; /* 処理直後の日時 - 処理直前の日時 = 処理時間 */ data _null_ ; PROCESS_TIME = datetime() - &START_TIME. ; putlog PROCESS_TIME= ; run ; 処理時間を計測した実行ログ 59 data _null_ ; 60 call symputx('START_TIME', datetime()) ; 61 run ; NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒 62 63 data TEST1 ; 64 do I=1 to 10000000 ; 65 R = ranuni(1) ; 66 output ; 67 end ; 68 run ; NOTE: データセットWORK.TEST1は10,000,000オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): ...