I'm a new SAS user, and I've inherited a bunch of code. I've noticed that running many programs take a very long time to run, but utilize almost no CPU or RAM (which I have plenty of). I think much of the code could be rewritten in a more efficient manner, perhaps some will have suggestions? Here's an example of a macro called for a very large dataset (440 fields, approx 6.7gb uncompressed): %macro SampleMacroName(updatedata,currdt); %let dt = %Sysfunc(InputN(01JAN2005, Date9)); %let currdt = %Sysfunc(InputN(&currdt, Date9)); %let loop = %sysfunc(intck(month,&dt,&currdt)); %do i=0 %to &loop; %let dt2 = %Sysfunc(INTNX(MONTH,&dt,&i)); %let year = %Sysfunc(year(&dt2)); %let mth = %Sysfunc(month(&dt2)); %let mth2 = %sysfunc(putN(&mth,mon.)); %let mth3 = %sysfunc(putN(&mth,z2.)); %let st&i = DATEFIELD_&mth2._&year; %let tm&i = &year.&mth3.01; %end; data &updatedata; set &updatedata; RESULTDATE = .; %do j=0 %to &loop; if(&&st&j = '2') then do; RESULTDATE = input("&&tm&j",yymmdd8.); goto out; end; %end; out: format RESULTDATE yymmdd10.; run; %mend; There are 3 other macros run immediately after this that are identical, except each looks for a "3" or "4" or "5" and respectively puts the result in a new date field. What are some more efficient techniques for achieving the same result? I don't quite know how the buffer in SAS works, but maybe I can check for 3,4,5's while the record remains in memory, as opposed to re-reading the complete file from the HD for each macro run? Cutting the fields down would also definitely help, as I imagine would putting the results into a new dataset (with only a key and the results) and then joining the results onto the the main dataset, so the main file is only updated once. What would be the best way to apply an update, given a transaction set? Normally with SQL I'd use an inner join in my update statement, but SAS doesn't seem to support this? and the suggested work around: http://support.sas.com/documentation/cdl/en/sqlproc/62086/HTML/default/viewer.htm#a002595787.htm runs a lot slower than I'd like. I haven't tried it yet with this macro, but elsewhere I've noticed that compressing the dataset really helps performance. Any other recommendations? I have 16gb of ram to play with, and SASFILE looked like an interesting feature, but I'm very new to SAS and haven't quite figured out how best I could possibly implement this feature.
... View more