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

时间:2015-02-03 19:10:49

标签: multithreading parallel-processing sas sas-ds2

我有一个包含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对数据进行子集化并将每个子集传递给自己的线程?

1 个答案:

答案 0 :(得分:3)

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

下面的唯一更改是by,并添加run()来检查自己。

proc means