楼主: 醉_清风
4042 5

分享一段宏——大数据排序问题 [推广有奖]

  • 0关注
  • 3粉丝

已卖:122份资源

副教授

43%

还不是VIP/贵宾

-

威望
0
论坛币
1300 个
通用积分
0.3563
学术水平
7 点
热心指数
24 点
信用等级
5 点
经验
28648 点
帖子
954
精华
0
在线时间
756 小时
注册时间
2010-1-26
最后登录
2022-11-16

楼主
醉_清风 发表于 2010-8-27 10:30:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
处理大数据排序时往往报硬盘空间不足内存不足等问题
解决方法:
方法一:在proc sort options 选项中加 tagsort选项。此选项简单的说是以时间换空间,即需要的空间较小,但

运行的时间会比较长。
方法二:将大数据集进行拆分,拆分成若干小数据集,对这些小数据集先进行排序,再进行合并


lib= 要排序数据集所在的库名(注意:要大写)
sort_data= 要排序的数据集(注意:要大写)
key= 要排序的字段
var=拆分数据集用到的字段(注意:要大写)

num=拆分数据集的个数
fnl_table= 排序后的输出数据集

/******************************************************************************/
%MACRO SORT_LARGE_DATA(LIB=,SORT_DATA=,KEY=,VAR=,NUM=,FNL_DATA=);

DATA _NULL_;
     SET SASHELP.VCOLUMN(WHERE=(LIBNAME="&LIB." AND MEMNAME="&SORT_DATA"));
   IF UPCASE(NAME)="&VAR." THEN CALL SYMPUT ('TYPE',UPCASE(TYPE));
RUN;

%MACRO SELECT;
%IF &TYPE.=NUM %THEN           
%STR(WHERE  MOD(&VAR.,&NUM.)=&I.-1;);
%IF &TYPE.=CHAR %THEN
%STR(WHERE SUBSTR(&VAR.,LENGTH(&VAR.),1)=:"&I";);
%MEND;

%DO I=1
%TO &NUM.;
PROC SORT DATA=&LIB..&SORT_DATA  OUT=PART&I;
BY  &KEY.;
%SELECT;
RUN;
%END;

DATA  &FNL_DATA;
SET
%DO I=1
%TO &NUM.;
PART&I
%END;
;
BY  &KEY.;
RUN;
%MEND ;
/***************************************************************************************/

举例如:%SORT_LARGE_DATA(LIB=SASHELP,SORT_DATA=CLASS,KEY=NAME,VAR=AGE,NUM=10,FNL_DATA=WORK.A);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:大数据 SASHELP VCOLUMN libname options 大数据 等问题

已有 1 人评分学术水平 热心指数 收起 理由
soporaeternus + 1 + 1 好的原创和分享

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

从来不需要想起 永远也不会忘记

沙发
soporaeternus 发表于 2010-8-27 12:14:11
谢谢分享
可能是养尊处优惯了,不太关心sort的开销问题
1 小试了下,最后set+by在时间上开销增加还是很明显的,空间上不是很清楚,不过应该远小于原数据直接排序
2 按mod方法来分会不会使得最后set+by的开销最大化,个人感觉按sort变量大小来分最后set+by的开销较小,但是不知道分布的前提下,比较麻烦
3 %STR(WHERE SUBSTR(&VAR.,LENGTH(&VAR.),1)=:"&I";);是不是取字符型变量的最后1位啊......
Let them be hard, but never unjust

藤椅
chouxiangdaishu 发表于 2010-8-27 12:54:10
如何以空间换时间?

板凳
醉_清风 发表于 2010-8-27 13:39:45
2# soporaeternus
确实目前只是实现而已
兄台有没有兴趣优化一下

%STR(WHERE SUBSTR(&VAR.,LENGTH(&VAR.),1)=:"&I";);确实是取最后一位 比如客户参考号 其最后一位基本满足均匀分布
从来不需要想起 永远也不会忘记

报纸
醉_清风 发表于 2010-8-27 13:43:27
3# chouxiangdaishu
TAGSORT stores only the BY variables and the observation numbers in temporary files. The BY variables and the observation numbers are called tags. At the completion of the sorting process, PROC SORT uses the tags to retrieve records from the input data set in sorted order.
Restriction:The TAGSORT option is not compatible with the OVERWRITE option. [/td]
Interaction:The TAGSORT option is not supported by the multi-threaded sort.[/td]
Tip:When the total length of BY variables is small compared with the record length, TAGSORT reduces temporary disk usage considerably.
从来不需要想起 永远也不会忘记

地板
ryuuzt 发表于 2010-8-27 14:37:16
对大数据的内存消耗倒不是 很在意。我用9.2的panel步时,会有内存不足的情况。看了错误提示,按照提示修改也不行。在网上搜索了一下,倒是有几个帖子相近,但是也不解决问题。跟朱式武老师请教过,也没有什么解决的方法。不知你遇到过这种情况吗?

我跑panel的时候,超过10万个观测的话,就完蛋了。应该是java的问题。不知道如何解决。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 22:30