2

DB2 データベース (ODBC、SAS EG 4.3 を使用して接続) にある約 2000 万のアドレスを消去しようとしています。以下はサンプルコードです。このコードは長時間実行されます。それを最適化する方法はありますか?これはおそらく、データ ステップではなく、SQL ステップで試行する必要がありますか (それがより高速になるかどうかはわかりません)。

%macro addy(orig_addy,edited_addy);
*scrub original address field;
addr=upcase(&orig_addy.);

addr=(left(tranwrd(cat(' ',addr,' '),' SO. ',' S ')));

addr=compress(addr,".,()'");
addr=translate(addr, ' ', '_/-#;');

&edited_addy.=left(prxchange('s/ NORTH / N /',-1,cat(' ',addr,' ')));
&edited_addy.=left(prxchange('s/ SOUTH / S /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ EAST / E /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ WEST / W /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ NORTHWEST / NW /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SOUTHWEST / SW /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ NORTHEAST / NE /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SOUTHEAST / SE /',-1,cat(' ',upcase(&edited_addy.),' ')));

&edited_addy.=left(prxchange('s/ SAINT / ST /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/   / /',-1,cat(' ',upcase(&edited_addy.),' '))); *tripple spaces;
&edited_addy.=left(prxchange('s/  / /',-1,cat(' ',upcase(&edited_addy.),' '))); *double spaces;
&edited_addy.=left(prxchange('s/ & / AND /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ @ / AT /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ INTERNATIONAL / INTL /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SUITE / STE /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SUITES / STES /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ FLOOR | FLR / FL /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ BUILDING / BLDG /',-1,cat(' ',upcase(&edited_addy.),' ')));
...
...
...

現在、これはわずか 200 万回の観測で 20 時間実行されています。ここで見たよりもはるかに多くの prxchange 条件があります。これは単なるサンプルです。

4

3 に答える 3

0

あなたが試すことができる他のいくつかのことがあります。

  • 正規表現を/oで終了すると、SASは文字列を1回だけコンパイルするように指示されるため、観測ごとに文字列を処理するべきではありません。
  • 一部またはすべての検索で一致が1回しか発生しないことが確実な場合は、-1を1に変更すると処理速度が向上します。
于 2012-07-20T09:46:34.380 に答える
0

生データを SAS にプルするだけで (正規表現を実行せずに) どれくらいの時間がかかりますか?

上記が迅速な場合、問題は SAS コードから mySQL コードへの変換が行われている可能性があります。200万回の観測で多くの正規表現を実行するのにそれほど時間がかかるとは思いません.以前に同様のプロセスをはるかに多くのデータで経験したことがあります.

2段階に分けることができます。

  1. 変更されていないデータを SAS に取り込みます。
  2. sas にクリーニング ルーチンを適用してもらいます。
于 2012-07-20T14:47:59.560 に答える
0

これを DATA ステップで実行しても問題ありません。遅い理由は、観測ごとに住所行のすべての文字を何百回も処理しているためです。(正規表現が定数の場合、SASは正規表現を事前解析すると思いますが、そうでない場合は、を使用PRXPARSEすると役立つ場合があります。)

すべての正規表現が (単語) -> (正規化された単語) の形式である場合、単語ごとに実行して、正規表現処理を完全にスキップできる場合があります。

于 2012-07-19T16:26:41.083 に答える