楼主: peijiamei
5494 12

[原创博文] 求最优算法:累计相乘 [推广有奖]

已卖:299份资源

学科带头人

75%

还不是VIP/贵宾

-

威望
3
论坛币
26157 个
通用积分
12.7133
学术水平
217 点
热心指数
343 点
信用等级
210 点
经验
75401 点
帖子
1099
精华
1
在线时间
2016 小时
注册时间
2007-11-15
最后登录
2016-3-21

楼主
peijiamei 发表于 2010-9-27 14:52:11 |AI写论文
50论坛币
codedate1date2r
1110.1
1120.2
1210.3
1220.4
2110.1
2120.2
2210.3
2220.5

根据上面的表格生成下面的表格
其中rr是相同date2 的数据的累计相乘

codedate1rr
110.02
120.12
210.02
220.15



注意:由于数据量很大(几亿的数据量),所以求优化的算法。

sql语句尽量不要!proc sort也会效率很低。


向各位高手致敬!

关键词:coded sql语句 date Oded code sql语句

回帖推荐

hopewell 发表于8楼  查看完整内容

不太确定,这种数量级的数据已经远远超出了我的认知水平,祝你好运.

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2010-9-27 15:42:05
抛个砖。。。

data test;
input code date1 date2 r ;
cards;
2 1 1 0.1
2 1 2 0.2
2 2 1 0.3
2 2 2 0.5
1 1 1 0.1
1 1 2 0.2
1 2 1 0.3
1 2 2 0.4
;
run;

proc tabulate data=test out=aa;
    class code date1 r;
    table code,date1,r;
run;

data wanted;
    set aa;
by code date1;
retain rr;
keep code date1 rr;
if first.date1 then rr=1;
rr=rr*(r**N);
if last.date1 then output;
run;
已有 1 人评分学术水平 热心指数 收起 理由
peijiamei + 3 + 2 好的意见建议

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

和谐拯救危机

藤椅
soporaeternus 发表于 2010-9-27 16:52:18
我只想到sql的求和和data步累乘
静等其他好的算法......
Let them be hard, but never unjust

板凳
hopewell 发表于 2010-9-27 21:42:18
原始数据集按code,date1排好序了吗?
date2起什么作用?是说每个code,date1组只有固定的2条记录吗?
计算后的结果数据集大概能有多少条记录?
已有 1 人评分学术水平 热心指数 收起 理由
peijiamei + 1 + 2 高手驾到!

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

报纸
crackman 发表于 2010-9-27 22:07:49
我觉得SAS是做不出来的

地板
peijiamei 发表于 2010-9-28 10:29:16
4# hopewell

原始数据集按code,date1排好序了吗?
没有进行排序,不过已经是group的。

date2起什么作用?是说每个code,date1组只有固定的2条记录吗?


date2是二级时间,在进行计算的时候实际上是没有用处的。
每个code,date1组有很多条记录,不固定。

计算后的结果数据集大概能有多少条记录?

总的数据有5千万,最后能剩下四分之一。(由于亿级数据处理不现实,所以拆分为7个文件,实际上总的数据有5千万*7)
我的微博:http://t.sina.com.cn/1087192374
欢迎互相加关注!

7
crackman 发表于 2010-9-28 10:42:42
DATA步
跑几个小时应该没得问题

8
hopewell 发表于 2010-9-28 11:14:59
不太确定,这种数量级的数据已经远远超出了我的认知水平,祝你好运.
  1. data raw;
  2.     input code date1 date2 r;
  3. cards;
  4. 2 1 1 0.1
  5. 2 1 2 0.2
  6. 2 2 1 0.3
  7. 2 2 2 0.5
  8. 1 1 1 0.1
  9. 1 1 2 0.2
  10. 1 2 1 0.3
  11. 1 2 2 0.4
  12. ;
  13. data _null_;
  14.     if _n_=1 then do;
  15.         declare hash h(hashexp: 16, ordered: 'a');
  16.         h.defineKey('code', 'date1');
  17.         h.defineData('code', 'date1', 'rr');
  18.         h.defineDone();
  19.         call missing(code, date1, rr);
  20.     end;
  21.     set raw end=last;
  22.     if h.find()=0 then do;
  23.         rr=r*rr;
  24.         rc=h.replace();
  25.     end;
  26.     else do;
  27.         rr=r;
  28.         rc=h.add();
  29.     end;
  30.     if last then rc=h.output(dataset: 'out');
  31. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
peijiamei + 2 + 1 hash是否是9.2的特有功能?

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

9
soporaeternus 发表于 2010-9-28 11:36:29
ERROR: 内存失败时,Hash 对象添加了 14942192 个项。
FATAL: 内存不足,无法执行 DATA 步程序。 EXECUTION 过程中止。
NOTE: SAS 系统由于内存不足而停止了对该步的处理。
NOTE: 从数据集 C.A 读取了 74710962 个观测。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         8:52.00
      CPU 时间         1:51.92


hash的速度果然很快,但是对内存容量可能要求很高,我是1G内存的PC,悲剧了......
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
hopewell + 1 + 1 + 1 好的意见建议
peijiamei + 3 + 1 好的意见建议

总评分: 学术水平 + 4  热心指数 + 2  信用等级 + 1   查看全部评分

Let them be hard, but never unjust

10
soporaeternus 发表于 2010-9-28 11:53:39
  1. data a;
  2.         do code=1 to 10000000 by 1;
  3.                 do date1= 1 to 10 by 1;
  4.                         do date2 = 1 to 5 by 1;
  5.                                 r=ranuni(123);
  6.                                 output;
  7.                         end;
  8.                 end;
  9.         end;
  10. run;
复制代码
我的测试数据是这样的
sql执行时间是
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间         49:08.34
      CPU 时间         12:20.10

应该是这个问题执行效率的一个上限吧
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
hopewell + 1 + 1 + 1 真敬业
crackman + 1 有研究精神

总评分: 学术水平 + 2  热心指数 + 1  信用等级 + 1   查看全部评分

Let them be hard, but never unjust

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

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