4

マスターデータセットに連結したいのと同じ変数(n <1000、通常はn <100)を持つ200kを超える小さなデータセットがあります。データステップを使用してすべての新しいデータセットを反復処理し、「set master new:」を使用してマスターと連結するマクロを使用してみましたが、これには非常に長い時間がかかります。また、同時に実行しようとすると、call execute dataステップは、巨大なサーバーボックスのメモリが不足していることを示します。参考までに、すべての小さなデータセットは合わせて5ギガ強です。任意の提案をいただければ幸いです。これが私がこれまでに持っているものです:

%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;

解決済み:以下のボブのコメントを参照してください。

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 に答える