将数据子集发送到 SAS DS2 线程

Send subset of data to SAS DS2 thread

我有一个包含 5 个组的数据集,我想使用 SAS 中的 DS2 过程同时计算组均值。

模拟数据集:

data sim;
    call streaminit(7);
    do group = 1 to 5;
        do pt = 1 to 500;
            x = rand('ERLANG', group);
            output;
        end;
    end;
run;

我设想它的工作方式是 5 个线程中的每一个都接收与特定组对应的数据子集。 x 的平均值在每个子集上计算如下:

proc ds2;
    thread t / overwrite=yes;
        dcl double n sum mean;

        method init();
            n = 0;
            sum = 0;
            mean = .;
        end;

        method run();
            set sim;    /* Or perhaps a subsetted dataset */
            sum + x;
            n + 1;
        end;

        method term();
            mean = sum / n;
            output;
        end;
    endthread;

    ...
quit;

问题是,如果您调用一个处理数据集的线程,如下所示,行将无意间发送到 5 个线程(即不考虑组)。

    data test / overwrite=yes;
        dcl thread t t_instance;
        method run();
            set from t_instance threads=5;
        end;
    enddata;

如何告诉 SAS 按 group 对数据进行子集化并将每个子集传递给它自己的线程?

我相信你必须在 run() 方法中添加 by 语句,然后添加一些代码来处理 by 组(即,如果你想让它输出 for last.group 然后添加代码来执行此操作并清除总数)。 DS2 应该很聪明,每个 by 组使用一个线程(或者至少每个线程处理整个 by 组)。我不确定如果您从磁盘读取是否会看到很大的改进(因为线程优势可能小于磁盘读取时间)但谁知道呢。

下面唯一的变化是在run(),加一个proc means自己检查。

data sim;
    call streaminit(7);
    do group = 1 to 5;
        do pt = 1 to 500;
            x = rand('ERLANG', group);
            output;
        end;
    end;
run;

proc ds2;
    thread t / overwrite=yes;
        dcl double n sum mean ;

        method init();
            n = 0;
            sum = 0;
            mean = .;
        end;

        method run();
            set sim;
            by group;
            sum + x;
            n + 1;
            if last.group then do;
                mean = sum / n;
                output;
                n=0;
                sum=0;
            end;
        end;

        method term();
        end;
    endthread;
  run;

  data test / overwrite=yes;
        dcl thread t t_instance;
        method run();
            set from t_instance threads=5; 
        end;
    enddata;
    run;    
quit;

proc means data=sim;
class group;
var x;
run;