原来就对sas macro没好感,费了一天劲儿写出来了个最简单的并行计算(其实才一半,因为剩下的都用R做了),现在好像更没好感了。。。
感觉这样的并行和写一个shell script是一样的,反正大家都是多开几个进程,别的似乎也没啥优势,而且好像任何语言的宏的debug难度都比runtime的code高。。。
可能用sas/connect在最后把数据汇总的时候会方便点,不过我还是喜欢用R来做剩下的部分了。
<br />
libname mydir '~/embryo/all.possible.models/';<br />
<br />
/* setting needed options */<br />
options autosignon;<br />
options sascmd='nohup nice sas ';<br />
options NOCONNECTWAIT ;<br />
*options NOCONNECTPERSIST ;<br />
options CONNECTPERSIST ;<br />
<br />
/* setting debugging options <br />
options mlogic;<br />
options mprint;<br />
options symbolgen;<br />
*/<br />
<br />
/*%let maxjob=4; *maximum number of jobs that can be run simultaneously;*/<br />
/*%let totjob=405; *total number of jobs that need to be run;*/<br />
<br />
%macro submitmaxjob (maxjob=4,totjob=405);<br />
%let job=0;<br />
%let njob=0;<br />
%do i= 1 %to &maxjob;<br />
%let p&i.stat=.v; /* local equivalent of job&i.stat */<br />
%end;<br />
%do %until(&job >= &totjob);<br />
%do i=1 %to &maxjob;<br />
%if &&p&i.stat eq .v %then %do;<br />
%let job=%eval(&job+1);<br />
%let njob=%eval(&njob+1);<br />
/********* submitting jobs to the so-called server ******/<br />
signon job&i CMACVAR=job&i.stat ;/* cmacvar is the status of the job */<br />
%syslput job=&job /REMOTE=job&i ;/* passing parameters to the server */<br />
rsubmit job&i SYSRPUTSYNC=YES inheritlib=(mydir);<br />
options nonotes errors=0;<br />
%include "model.&job..sas"; /* sas prg for each model, parsed locally */<br />
endrsubmit;<br />
%let p&i.stat = &&job&i.stat ; /* make a local copy of the job status */<br />
%goto endrsub;<br />
%end;<br />
%end;<br />
<br />
%endrsub:<br />
%if &njob=&maxjob %then %do; /* reached max. allowable jobs, wait for next vacancy */<br />
waitfor _ANY_ %do i=1 %to &maxjob;<br />
job&i <br />
%end;;<br />
%do i=1 %to &maxjob;<br />
%if &&job&i.stat<2 %then %do;<br />
%let njob=%eval(&njob -1);<br />
%let p&i.stat=.v;<br />
%let job&i.stat=;<br />
signoff job&i;<br />
%end;<br />
%end;<br />
%end;<br />
%end;<br />
waitfor _ALL_ %do i=1 %to &maxjob;<br />
job&i <br />
%end;;<br />
killtask _ALL_;<br />
%mend submitmaxjob;<br />
<br />
<br />
%submitmaxjob (maxjob=4,totjob=405);<br />