将数据分成不同的子集导致SAS中没有足够的空间错误

将数据分成不同的子集导致SAS中没有足够的空间错误,sas,Sas,我有一个关于15G的文件,有两年的数据。我试着用下面的部分SAS代码将这两年分成两个不同的文件。例如,中间处理的数据称为A_20112012_xxx,分离的数据称为B_2011_xxx,B_2012_xxx %let列=年 procsqlnoprint; 选择不同的 类别(“数据B”列和“xxx;” ,“设置A_20112012_xxx;” ,“其中&column=”,&column.,“;” “跑” ) 分为:以“;”分隔的步骤 来自A_20112012_xxx; 退出 &分步走 虽然将它们逐

我有一个关于15G的文件,有两年的数据。我试着用下面的部分SAS代码将这两年分成两个不同的文件。例如,中间处理的数据称为A_20112012_xxx,分离的数据称为B_2011_xxx,B_2012_xxx

%let列=年

procsqlnoprint;
选择不同的
类别(“数据B”列和“xxx;”
,“设置A_20112012_xxx;”
,“其中&column=”,&column.,“;”
“跑”
)
分为:以“;”分隔的步骤
来自A_20112012_xxx;
退出
&分步走

虽然将它们逐个分开并没有问题,但如果按上述方法进行操作,则始终会导致出现空间不足的错误消息。这样做的原因是有超过2年的文件需要分开。我只是想自动化这个过程


导致“空间不足”错误的可能原因是什么?

可能是在使用cat处理所有行之前,不会发生distinct操作。这意味着您有大量行(每个15G表)的内部临时资源,在为distinct操作删除重复项之前具有宽cat结果(默认长度为200个字符)

尝试将不同的选择移动到“发件人”中

%let column = years;
proc sql noprint;
    select
      cat ("data B", &column., "xxx;"
           ,  "set A_20112012_xxx;"
           ,  "where &column=", &column., ";"
           ,  "run;"
           )
    into :SplitSteps separated by ";"
    from (select distinct &column from A_20112012_xxx)
    ;
 quit;

 &SplitSteps;
有时为了清晰起见,最好将其模块化

%macro data_fracker (data=, column=);
  %macro split_for (value);
    data B_&value._xxx;
      set &data;
      where &column = &value;
    run;
  %mend;
  %local dispatch;
  proc sql noprint;
    select cats('%split_for(', &column, ')')
    into :dispatch separated by ' '
    from (select distinct &column from &data)
    ;
  quit;
  &dispatch
%mend;

%data_fracker (data=sashelp.class, column=age)
而且

  • 什么是操作系统和硬件
  • 如果是Windows,驱动器空间是多少?
    • wmic logicaldisk列表简要介绍了什么
  • 工作libref的文件夹是什么
  • 实际日志是多少
  • 是否运行了任何拆分步骤

您不使用视图或按组处理而不是拆分为单独的数据集有什么特殊原因吗?将单个文件拆分为单独的数据集是一项要求。我尝试用一个宏来自动处理不同年份的不同文件。所以最后,马可可以像%macro一样(libname=,data=,years=20112012),然后每年拆分数据。它还可以工作3年、4年等,因此不需要手动调整多年。如果有一种更有效的方法来做这件事,那就太好了。否则,到目前为止,这就是我所知道的。为什么要使用SQL?使用数据步骤!你会有足够的记忆力。谢谢你的回复。我在一个云设备上工作,无法访问实际的windows服务器界面。我认为是windows 2012服务器在后端。我怀疑,这可能是由于临时文件夹的大小有限。我确实要求增加指定存储文件夹的大小以及工作目录。实际上,宏观上有两个分割步骤,一个是问题中的步骤,另一个是每年的一系列计算,然后分割。问题中的那一个实际上得到了运行,是第二部分得到了错误消息,只是为了节省一些空间