SASをマルチプロセスで実行したい - OSコマンドを非同期/同期で実行する systaskステートメント、実行が終るまで処理を止める waitforステートメント
今回は、(現時点では) SAS雲丹(SAS University Edition) で実行できないステートメントのお話。 SAS9.4では、DS2 でマルチスレッドができるみたいですけど、SAS9.3以前で似たようなものができないものか。proc sortとか一部のプロシージャはマルチで動くようになったけど、それだけでは足りない。SPDエンジンは使える環境ではない。どうしたものか。 そんなこんなで探して見つけたのが、systaskステートメントです。systaskステートメントは、OSのコマンドを実行するためのステートメントです。OSのコマンドを実行するには、filenameステートメントのpipe、Xステートメント、call systemルーチンなどがありますが、非同期では実行できません。systaskステートメントならば非同期または同期のどちらかを指定して実行することが出来ます。(同期 = 実行終了を待って後続の処理を実行、 非同期 = 実行終了待たずに後続の処理を実行) まず、どのように書くのかを見てみましょう。 systask command "pwd" taskname="TASK_1" status=STATUS_1 ; 上記の例では、現在のディレクトリの位置を表示する pwd コマンドを実行しています。 taskname= で指定したのがタスク名です。指定したタスクが実行終るまで待つ、指定したタスクを kill する、といったときにタスク名を使います。 status= ではコマンドの出力結果が、指定したマクロ変数に格納されます。OSやらコマンドにもよると思いますが、例えば、正常終了ならば 0 、異常終了ならば 1 が格納される、といった感じです。 また、コマンドの標準出力の結果は、ログに出力されます。 さて、systaskステートメントでどうやってマルチで動かすかというと、SASのバッチ実行を使います。SASバッチを使うことで、SASの中で、SASを非同期で実行させます。 systask command "sas sample1.sas" taskname="TASK_1" status=STATUS_1 ; systask com...