我以前很少使用proc freq。我试图运行以下内容,并收到错误,表示SAS无法分配足够的内存。该数据集有大约15,000条记录。我在这里有什么选择?SAS - proc freq ...内存不足?
proc freq data=dsb_un noprint;
table bsn*dsb/out=dsb_un2(where=(count>1) drop=percent);
run;
我以前很少使用proc freq。我试图运行以下内容,并收到错误,表示SAS无法分配足够的内存。该数据集有大约15,000条记录。我在这里有什么选择?SAS - proc freq ...内存不足?
proc freq data=dsb_un noprint;
table bsn*dsb/out=dsb_un2(where=(count>1) drop=percent);
run;
既然你百分之下降,下面应该是相同的:
proc freq data=dsb_un noprint;
by bsn;
tables dsb/out=dsb_un2(where=(count>1) drop=percent);
run;
的BY语句应显著减少内存分配。你也可以用类似的方式使用PROC SQL,这可能适合内存。
问题很可能是DSB和BSN每个都是独特的值,所以你可能每个都有10k +的值 - 制作一个10k * 10k或1e8单元的主表,需要8e8字节的内存,这可能是超出了SAS的可用内存。
在看到你的建议之前,我实际上可以通过在它之前添加一个数据步骤来将我的原始freq工作,以将记录缩小到几百个。我只是测试了你的建议,它完美的工作。谢谢您的帮助! – user2941280
我以前也碰到过这个。我得到的方式是根本不使用proc freq
。我相信我用proc summary
代替。它也可以计数频率。
首先测试数据集:
data tmp;
set sashelp.class;
dummy = 1;
run;
使用原来的freq
方法:
proc freq data=tmp noprint;
table sex*age/out=freq1(where=(count>1) drop=percent);
run;
使用proc summary
方法:
proc summary data=tmp noprint nway missing;
class sex age;
var dummy;
output out=freq2(where=(dummy>1) drop=_type_ _freq_) sum=;
run;
注意proc summary
可能需要一个虚拟变量你可以计算反对。因此,在我的测试数据集中创建了dummy=1
标志。
你有多少个独特的BSN和DSB值? – Joe