将数据子集发送到 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;
我有一个包含 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;