【问题标题】:SAS - proc freq...insufficient memory?SAS - proc freq ...内存不足?
【发布时间】:2014-04-17 16:03:32
【问题描述】:

我以前很少使用 proc freq。我正在尝试运行以下命令,但收到一条错误消息,指出 SAS 无法分配足够的内存。该数据集有大约 15,000 条记录。我在这里有什么选择?

proc freq data=dsb_un noprint; 
table bsn*dsb / out=dsb_un2(where=(count>1) drop=percent); 
run;

【问题讨论】:

  • BSN 和 DSB 的唯一值有多少?

标签: memory sas


【解决方案1】:

由于您正在下降百分比,因此以下内容应该相同:

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 的可用内存。

【讨论】:

  • 在看到您的建议之前,我实际上能够通过在原始 proc freq 之前添加一个数据步骤来将记录缩小到几百条,从而使其正常工作。我刚刚也测试了您的建议,并且效果很好。感谢您的帮助!
【解决方案2】:

我以前也打过这个。我解决它的方法就是不使用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 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多