当我需要多次调用宏时,我一直在DATA NULL 步骤中使用CALL EXECUTE,如下所示:
DATA _NULL_;
DO i=1 to 1000;
CALL EXECUTE ('%mymacro');
RUN;
到目前为止,这对我来说还是不错的。但是,如果我使用这种方法调用%mymacro一百万次(例如),在运行一次宏之前,我会收到“内存不足”错误。
我对此的天真理解是SAS试图在执行之前将宏写出一百万次,因此在此过程中内存不足。这个准确吗?并且:有什么好的方法可以解决这个问题?
答案 0 :(得分:0)
您只需要了解Call Execute
的工作原理:
基本上,Call Execute
会立即解析宏代码,但是会将最终的SAS步骤排队,直到当前数据步骤完成为止。换句话说,您可能会在data _null_
步骤完成后在SAS刚刚存储的内存中建立数百万行的SAS代码。最终,它变得太大,以至于SAS崩溃。
以下是几种解决方案:
1-将
%nrstr()
添加到您的CALL EXECUTE语句中。2-或更改您的
data _null_
步骤以生成包含代码和%include
的文件。
答案 1 :(得分:0)
一个选择是改变数据步骤,以便它实际上创建一个包含宏调用的.sas
文件,然后%include
。例如:
data _null_;
file "myfile.sas";
do i=1 to 1000;
put '%mymacro';
end;
run;
%include "myfile.sas";
此可能解决了该问题。再说一次,我不确定SAS是否需要包含100万行代码的.sas
程序。如果是后者,则只需将该程序分解为10个.sas
文件,每个文件包含10万行代码。