楼主: 〇〇

[有奖问答] 用过程语言实现group by cube的代码挑战赛

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
91#
发表于 2010-3-11 00:47 | 只看该作者
这个看不懂:
#define adsmkey(j) {if((iter=key_recn2[j].find(key))== key_recn2[j].end()){key_recn2[j][key]=c++;f[j]++;int recn=c-c_2;k2[recn]=key;C2[recn]+=C;v3[recn]+=v2;}\
else{f[j]++;int recn=/*key_recn2[j][key]-c_2*/(*iter).second-c_2;k2[recn]=key;C2[recn]+=C;v3[recn]+=v2;}}

你既然按gid分开存放数据,为什么key还是全部放在同一个k2[]中?

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
92#
 楼主| 发表于 2010-3-11 05:33 | 只看该作者

回复 #91 newkid 的帖子

是为了申请内存和输出的方便
不然要申请16块,现在2块,输出也是只要输出2个数组

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
93#
发表于 2010-3-11 06:28 | 只看该作者
你的KEY构造为什么这么复杂?
int key=(((*iter).first)&0x0FFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3

我仅仅是简单地把gid拼接到后面。把原值左移然后右边拼上0-F的gid这样不行吗?

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
94#
 楼主| 发表于 2010-3-11 07:16 | 只看该作者

回复 #93 newkid 的帖子

我的c1取值是0-8,null用15表示,用4bit,c2-c4取值是0-126,null用127表示,用8bit 一个整数有4bytes,只能把gid放在第一个byte的前4位了,这是4个分组的权宜之计,

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
95#
 楼主| 发表于 2010-3-12 11:17 | 只看该作者
把第3层新建节点adkey(3)和汇总sumkey(3)的动作合并,时间没有变化,因为记录很少
但第2层节点想用
for(iter=key_recn.begin();iter != key_recn.end(); iter++)
代替
for (i=0;i<c_2;i++)
执行不成功


D:\app\instantclient10_1>..\map9f LT/LT@10.6.132.43/orcl query="select c1,c2,c3,c4,v from t" file=NUL

       0 rows exported at 2010-03-12 11:14:25
recn=0
  500000 rows exported at 2010-03-12 11:14:26
recn=500000
1000000 rows exported at 2010-03-12 11:14:27
         output file  closed at 1000000 rows.

sum=1
sum(c1+c2+c3+v)=500111497488
sum(c4)=51690810
从数据库把表读入内存3260ms
4,5,67,114,152760
申请map内存0ms
max_size4212816..申请一层内存31ms
新建一层节点468ms,recn=1000000,每毫秒读2136行,每毫秒写2136节点
申请后面内存16ms,1000000
新建后面节点2231ms,recn=2299601,每毫秒读448行key,每毫秒写582节点
0,first=2,renc=0
1,first=1000007F,renc=1000004
2,first=20007F00,renc=1000003
3,first=30007F7F,renc=2260124
4,first=407F0000,renc=1000002
5,first=507F007F,renc=2260126
6,first=607F7F00,renc=2284776
7,first=707F7F7F,renc=2284670
8,first=8F000000,renc=1000001
9,first=9F00007F,renc=2260125
10,first=AF007F00,renc=2273611
11,first=BF007F7F,renc=2284669
12,first=CF7F0000,renc=2284777
13,first=DF7F007F,renc=2299368
14,first=EF7F7F00,renc=2299487
15,first=FF7F7F7F,renc=1000000

Total number of rows to be inserted is 1000000
插入结果表time=3385

Total number of rows to be inserted is 1299601
插入结果表time=4820
释放所有动态内存16ms,2299601
释放所有map内存203ms,2299601
总时间11638ms,2299601
3步(读入+运算+写出)总时间14898ms

Exiting with SUCCESS status 0

SQL> select count(*) cnt,gid from tcube group by gid order by gid;

       CNT        GID
---------- ----------
   1000000          0
    103887          1
     99522          2
       873          3
    122094          4
      1071          5
      1026          6
         9          7
    934620          8
     11543          9
     11058         10
        97         11
     13566         12
       119         13
       114         14
         1         15

已选择16行。

SQL> select count(*) cnt,gid from yourcube group by gid order by gid;

       CNT        GID
---------- ----------
   1000010          0
    199780          1
    106708          2
       873          3
    144585          4
      1071          5
      1026          6
         1          7
    809047          8
     11543          9
     11058         10
        99         11
     13566         12
       119         13
       114         14
         1         15

已选择16行。

结果错太多了,删除附件
SQL> select * from tcube where gid=15;

        C1         C2         C3         C4                    SV         CV        GID
---------- ---------- ---------- ---------- --------------------- ---------- ----------
                                                     500000500000    1000000         15

SQL> select * from yourcube where gid=15;

        C1         C2         C3         C4                    SV         CV        GID
---------- ---------- ---------- ---------- --------------------- ---------- ----------
        15        127        127        127   6192300488041953763 1744978706         15

[ 本帖最后由 〇〇 于 2010-3-12 11:29 编辑 ]

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
96#
 楼主| 发表于 2010-3-12 16:44 | 只看该作者
貌似找到汇总错误的原因了,c++的错误。



#define addskey {if((iter=key_recn.find(key))== key_recn.end()){key_recn[key]=c++;int recn=c;k[recn]=key;C[recn]++;v2[recn]+=v1[i ];}\

应该是

#define addskey {if((iter=key_recn.find(key))== key_recn.end()){key_recn[key]=c;int recn=c;k[recn]=key;C[recn]++;v2[recn]+=v1[i ];c++;}\

map9n.rar

9.57 KB, 下载次数: 10

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
97#
 楼主| 发表于 2010-3-12 21:30 | 只看该作者
汇总结果正确的代码
但是这里很丑
text *sqlstmt = (text *)"INSERT INTO yourcube (c1,c2,c3,c4,cv,sv,gid) \
values (decode(:c1,15,NULL,:c1),decode(:c2,127,NULL,:c2),decode(:c3,127,NULL,:c3),\
decode(:c4,127,NULL,:c4),:cv,mod(:sv+4294967296,4294967296)+:sv1*4294967296,:gid)";

mapc.rar

8.6 KB, 下载次数: 10

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
98#
发表于 2010-3-12 23:35 | 只看该作者
好像写成++c就可以。C语言太精简了,有时候很令人困惑。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
99#
 楼主| 发表于 2010-3-13 07:58 | 只看该作者

回复 #98 newkid 的帖子

因为recn是数组下标,从0开始,所以++c在这里不行,它是先自增再赋值,

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
100#
 楼主| 发表于 2010-3-13 11:07 | 只看该作者
把95楼的思路实现了,汇总速度又提高1秒,印证了
http://www.itpub.net/thread-1276989-1-2.html 4楼的说法,从红黑树输出效率比从数组输出高

D:\app\instantclient10_1>..\mapc LT/LT@10.6.132.43/orcl query="select c1,c2,c3,c4,v from t" file=NUL

       0 rows exported at 2010-03-13 10:35:25
recn=0
  500000 rows exported at 2010-03-13 10:35:26
recn=500000
1000000 rows exported at 2010-03-13 10:35:28
         output file  closed at 1000000 rows.

sum=1
sum(c1+c2+c3+v)=500111497488
sum(c4)=51690810
从数据库把表读入内存3276ms
4,5,67,114,152760
申请map内存0ms
申请一层内存16ms
新建一层节点468ms,recn=1000000,每毫秒读2136行,每毫秒写2136节点
申请后面内存31ms,1000000
新建后面节点2137ms,recn=2299600,每毫秒读467行key,每毫秒写608节点
0,first=2,renc=0
1,first=1000007F,renc=1422764
2,first=20007F00,renc=1367261
3,first=30007F7F,renc=2260123
4,first=407F0000,renc=1433256
5,first=507F007F,renc=2260125
6,first=607F7F00,renc=2284775
7,first=707F7F7F,renc=2284669
8,first=8F000001,renc=1547887
9,first=9F00007F,renc=2260124
10,first=AF007F00,renc=2273610
11,first=BF007F7F,renc=2284668
12,first=CF7F0000,renc=2284776
13,first=DF7F007F,renc=2299367
14,first=EF7F7F00,renc=2299486
15,first=FF7F7F7F,renc=2284670
汇总后面节点2153ms,recn=2299600,每毫秒读464行,每毫秒写603行

Total number of rows to be inserted is 1000000
插入结果表time=5382

Total number of rows to be inserted is 1299600
插入结果表time=6302
释放所有动态内存15ms,2299600
释放所有map内存203ms,2299600
总时间14789ms,2299600
3步(读入+运算+写出)总时间18080ms

Exiting with SUCCESS status 0

D:\app\instantclient10_1>..\mapc2 LT/LT@10.6.132.43/orcl query="select c1,c2,c3,c4,v from t" file=NUL

       0 rows exported at 2010-03-13 10:58:53
recn=0
  500000 rows exported at 2010-03-13 10:58:54
recn=500000
1000000 rows exported at 2010-03-13 10:58:55
         output file  closed at 1000000 rows.

sum=1
sum(c1+c2+c3+v)=500111497488
sum(c4)=51690810
从数据库把表读入内存3385ms
4,5,67,114,152760
申请map内存0ms
申请一层内存31ms
新建一层节点468ms,recn=1000000,每毫秒读2136行,每毫秒写2136节点
申请后面内存31ms,1000000
新建后面节点1279ms,recn=2299600,每毫秒读781行key,每毫秒写1016节点
0,first=2,renc=0
1,first=1000007F,renc=1000003
2,first=20007F00,renc=1002132
3,first=30007F7F,renc=2260123
4,first=407F0000,renc=1049901
5,first=507F007F,renc=2260125
6,first=607F7F00,renc=2284775
7,first=707F7F7F,renc=2284669
8,first=8F000001,renc=1147278
9,first=9F00007F,renc=2260124
10,first=AF007F00,renc=2273610
11,first=BF007F7F,renc=2284668
12,first=CF7F0000,renc=2284776
13,first=DF7F007F,renc=2299367
14,first=EF7F7F00,renc=2299486
15,first=FF7F7F7F,renc=2284670

Total number of rows to be inserted is 1000000
插入结果表time=5226

Total number of rows to be inserted is 1299600
插入结果表time=9516
释放所有动态内存0ms,2299600
释放所有map内存187ms,2299600
总时间16926ms,2299600
3步(读入+运算+写出)总时间20326ms

Exiting with SUCCESS status 0

mapcorrect.rar

8.87 KB, 下载次数: 13

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表