SAS在调用宏时内存不足
当我需要多次调用一个宏时,我在一个数据为空的步骤中使用了call EXECUTE,如下所示:SAS在调用宏时内存不足,sas,Sas,当我需要多次调用一个宏时,我在一个数据为空的步骤中使用了call EXECUTE,如下所示: DATA _NULL_; DO i=1 to 1000; CALL EXECUTE ('%mymacro'); RUN; 到目前为止,这对我很有效。但是,如果使用此方法调用%mymacro一百万次(例如),则在它运行宏一次之前会出现“内存不足”错误 我对这一点的天真理解是,SAS在执行宏之前尝试“写出”宏一百万次,因此在此过程中内存不足。这准确吗?还有:有什么好方法可以解决这个问题?您只需
DATA _NULL_;
DO i=1 to 1000;
CALL EXECUTE ('%mymacro');
RUN;
到目前为止,这对我很有效。但是,如果使用此方法调用%mymacro一百万次(例如),则在它运行宏一次之前会出现“内存不足”错误
我对这一点的天真理解是,SAS在执行宏之前尝试“写出”宏一百万次,因此在此过程中内存不足。这准确吗?还有:有什么好方法可以解决这个问题?您只需要了解
调用执行
是如何工作的:
基本上,callexecute
将立即解析宏代码,但它会将生成的SAS步骤排队,直到当前数据步骤完成。换句话说,您可能正在内存中构建数以百万计的SAS代码行,SAS正在存储这些代码,以便在data\unull\uu
步骤完成时执行。最终,它变得如此之大以至于SAS崩溃了
以下是一些解决方案:
1-将%nrstr()
添加到调用执行语句中
2-或更改数据\u null
步骤,以生成带有代码的文件,并%包含该文件
一个选项是更改数据步骤,以便它实际创建一个包含宏调用的.sas
文件。。。然后,%包含它。对于exmaple:
data _null_;
file "myfile.sas";
do i=1 to 1000;
put '%mymacro';
end;
run;
%include "myfile.sas";
这可能会解决问题。我也不确定SAS是否想要一个包含一百万行代码的.SAS
程序。如果是后者,那么只需将程序分成10个.sas
文件,每个文件有100k行代码。好的,是的:我想调用EXECUTE“搁置”当前的数据步骤,执行要执行的任何操作,然后返回到原始数据步骤。如果您觉得我的答案有帮助,我希望您接受;)调用%nrstr(%mymacro)如何帮助解决此问题?SAS是否只对字符串“%mymacro”(或其他任何字符串)的实例进行排队?%NRSTR
函数在编译宏时屏蔽字符串,调用执行(“%NRSTR(%yourmacro);”)
SAS不会每次写入宏的源代码,而只写入宏的调用。如果将call execute
切换到dosubl
,会发生什么情况?%mymacro
的范围有多广?调用宏1E6次表示设计不完整或伸缩性差。