4

我有超过 20 万个具有相同变量(n<1000,通常是 n<100)的小数据集,我想将它们连接到主数据集中。我尝试使用一个宏,它使用一个数据步骤来遍历所有新数据集,并使用“set master new:”与主数据集连接,但这需要很长时间。此外,如果我尝试同时运行,调用执行数据步骤会说我在一个巨大的服务器机器上内存不足。作为参考,所有小数据集加起来刚刚超过 5 Gigs。任何建议将不胜感激。这是我到目前为止所拥有的:

%macro catDat(name, nbr) ;
    /*call in new dataset */
    data new ;
    set libin.&name ;
    run ;

    /* reorder names */
    proc sql noprint;
    create table new as 
    select var1, var2, var3
    from new;
    quit;

    %if &nbr = 1 %then %do ;
        data master;
        set new;
        run;
    %end; 
    %if &nbr > 1 %then %do ;
        data master;
        set master new ;
        run;
    %end ;
%mend;

/* concatenate datasets */
data runthis ;
set datasetNames ;
call execute('%catdat('||datasetname||','||_n_||')');
run;

已解决:请参阅下面 Bob 的评论。

4

1 回答 1

10

尝试使用PROC APPEND而不是您的“新”数据集;这会快得多:

%macro DOIT;

proc sql noprint;
   select count(*) into : num_recs
   from datasetNames;
quit;

%do i=1 %to &num_recs;

data _null_;
  i = &i;
  set datasetNames point=i;
  call symput('ds_name',datasetname);
  stop;
run; /* UPDATE:  added this line */

%if &i = 1 %then %do;
/* Initialize MASTER with variables in the order you wish */
data master(keep=var1 var2 var3);
   retain var1 var2 var3;
   set libin.&ds_name;
   stop;
run;
%end;

proc append base=master data=libin.&ds_name(keep=var1 var2 var3);
run;

%end;

%mend DOIT;

PROC APPEND将每个数据集添加到您的新“主”中,而无需像您现在所做的那样每次都重新构建它。这也避免了使用CALL EXECUTE,消除了您遇到的内存问题(由于在执行堆栈中生成了如此多的代码)。

于 2012-11-18T18:31:29.767 回答