|
|
用newkid多次rollup的办法从中间结果汇总,又减少了1.5秒
- /* compiled by cl of vc2003*/
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <map>
- #include <iostream>
- #define add_key {if((key_recn.find(key))== key_recn.end())key_recn[key]=c++;}
- #define addkey {if((key_recn2.find(key))== key_recn2.end())key_recn2[key]=c++;}
- #define adkey(i) {if((key_recn2[i].find(key))== key_recn2[i].end())key_recn2[i][key]=c++;}
- #define sumkey(i) {f[i]++;int recn=key_recn2[i][key]-c_2;k2[recn]=key;C2[recn]+=C2[(iter->second)-c_2];v3[recn]+=v3[(iter->second)-c_2];}
- #define __int64 long long
- using namespace std;
- struct ltstr
- {
- bool operator()(const char* s1, const char* s2) const
- {
- return strcmp(s1, s2) < 0;
- }
- };
- struct ltint
- {
- bool operator()(const int s1, const int s2) const
- {
- return (s1<s2) ;
- }
- };
- int main()
- {
- int s[3][3]={ {4,5,67},{9,19,109},{9,97,119}};
- //printf("%d,%d",t[0][1],t[1][2]);
- //return 0;
- for(int r=2;r<3;r++)
- {
- long t=clock();
- printf("%d,%d,%d,114,%d\n",s[r][0],s[r][1],s[r][2],s[r][0]*s[r][1]*s[r][2]*114);
- char* c1=(char*)malloc(1E6L);
- char* c2=(char*)malloc(1E6L);
- char* c3=(char*)malloc(1E6L);
- char* c4=(char*)malloc(1E6L);
- int* v1=(int* )malloc(4E6L);
- printf("申请源表内存%dms\n",clock()-t);
- t=clock();
- __int64* v2;//store sum(v1);
- //FILE *fp=fopen("in.txt","wb");
- //FILE *fp=fopen("in.txt","rb");
- for (int i=0;i<1E6L;i++)
- {
- int j=i+1;
- c1[i]=j%s[r][0];
- c2[i]=j%s[r][1];
- c3[i]=j%s[r][2];
- c4[i]=(j%13?j%113:127);
- v1[i]=j;
- //fscanf(fp,"%d,%d,%d,%d,%d\n",&c1[i],&c2[i],&c3[i],&c4[i],&v1[i]);
- //fprintf(fp,"%d,%d,%d,%d,%d\n",c1[i],c2[i],c3[i],c4[i],v1[i]);
- }
- //fclose(fp);
- //return 1;
- map<const int, int, ltint> key_recn;
- map<const int, int, ltint> key_recn2[16];
- int c=0;
- printf("填充源表数据%dms,recn=%d,每毫秒%d行\n",clock()-t,c,(long)1E6/(clock()-t));
- t=clock();
- for (int i=0;i<1E6L;i++)
- {
- int key=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
- //printf("key=%d\n",key);
- add_key;
- }
- printf("新建一层节点%dms,recn=%d,每毫秒读%d行,每毫秒写%d节点\n",clock()-t,c,(long)1E6/(clock()-t),c/(clock()-t));
- t=clock();
- int *C=(int*)malloc(c*4);//store count(c1)
- int *k=(int*)malloc(c*4);//store key
- v2=(__int64*)malloc(c*8);
- memset(C,0,c*4); //need?
- memset(v2,0,c*8);
- printf("申请一层内存%dms\n",clock()-t);
- t=clock();
- for (int i=0;i<1E6L;i++)
- {
- int recn=key_recn[(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i]];
- k[recn]=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
- C[recn]++;
- v2[recn]=v2[recn]+v1[i];
- }
- printf("写入一层数据%dms,recn=%d,每毫秒读%d行,每毫秒写%d行\n",clock()-t,c,(long)1E6/(clock()-t),c/(clock()-t));
- t=clock();
- int c_2=c;
- for (int i=0;i<c_2;i++)
- {
- int key=(k[i]&0xFFFFFF)+((0x80+15)<<24);//set c1 null ,gid=8
- adkey(8);
- key=(k[i]&0xFF00FFFF)+((0x40)<<24)+(127<<16);//set c2 null,gid=4
- adkey(4);
- key=(k[i]&0xFFFF00FF)+((0x20)<<24)+(127<<8);//set c3 null,gid=2
- adkey(2);
- key=(k[i]&0xFFFFFF00)+((0x10)<<24)+(127);//set c4 null,gid=1
- adkey(1);
- /*
- key=(k[i]&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
- adkey(9);
- key=(k[i]&0xFF00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
- adkey(5);
- key=(k[i]&0xFFFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
- adkey(3);
- key=(k[i]&0xFF0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
- adkey(6);
- key=(k[i]&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
- adkey(10);
- key=(k[i]&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
- adkey(12);
- key=(k[i]&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
- adkey(13);
- key=(k[i]&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
- adkey(14);
- key=(k[i]&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
- adkey(11);
- key=(k[i]&0xFF000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
- adkey(7);
- key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
- adkey(15);
- */
- }
- map<const int, int,ltint>::iterator iter;
- for(int i=1;i<7;i++)
- {
- if (i==1)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x0FFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
- adkey(3);
- key=((iter->first)&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
- adkey(9);
- key=((iter->first)&0x0F00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
- adkey(5);
- }
- if(i==2)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
- adkey(10);
- }
- if(i==4)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x0F0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
- adkey(6);
- key=((iter->first)&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
- adkey(12);
- }
- if(i==3)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
- adkey(11);
- key=((iter->first)&0x0F000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
- adkey(7);
- }
- if(i==5)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
- adkey(13);
- }
- if(i==6)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
- adkey(14);
- }
- }
- int key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
- adkey(15);
- printf("新建后面节点%dms,recn=%d,每毫秒读%d行key,每毫秒写%d节点\n",clock()-t,c,c_2/(clock()-t),(c-c_2)/(clock()-t));
- for(int i=0;i<16;i++)
- {
- printf("%d,first=%0X,renc=%d\n",i,key_recn2[i].begin()->first,key_recn2[i][key_recn2[i].begin()->first]);
- }
- t=clock();
- int o[15]={8,4,2,1,9,5,3,6,10,12,13,14,11,7,15};
- int mask[15]={
- 0x00FFFFFF,
- 0xFF00FFFF,
- 0xFFFF00FF,
- 0xFFFFFF00,
- 0x00FFFF00,
- 0xFF00FF00,
- 0xFFFF0000,
- 0xFF0000FF,
- 0x00FF00FF,
- 0x0000FFFF,
- 0x0000FF00,
- 0x000000FF,
- 0x00FF0000,
- 0xFF000000,
- 0x00000000};
- int null[15]={
- ((0x80+15)<<24),
- ((0x40)<<24)+(127<<16),
- ((0x20)<<24)+(127<<8),
- ((0x10)<<24)+(127),
- ((0x90+15)<<24)+(127),
- ((0x50)<<24)+(127<<16)+(127),
- ((0x30)<<24)+(127<<8)+(127),
- ((0x60)<<24)+(127<<16)+(127<<8),
- ((0xA0+15)<<24)+(127<<8),
- ((0xC0+15)<<24)+(127<<16),
- ((0xD0+15)<<24)+(127<<16)+(127),
- ((0xE0+15)<<24)+(127<<16)+(127<<8),
- ((0xB0+15)<<24)+(127<<8)+(127),
- ((0x70)<<24)+(127<<16)+(127<<8)+(127),
- ((0xF0+15)<<24)+(127<<16)+(127<<8)+(127)
- };
- int *C2=(int*)malloc((c-c_2)*4);//store count(c1)
- int *k2=(int*)malloc((c-c_2)*4);//store key
- __int64* v3=(__int64*)malloc((c-c_2)*8);
- memset(C2,0,(c-c_2)*4); //need?
- memset(v3,0,(c-c_2)*8);
- printf("申请后面内存%dms,%d\n",clock()-t,c);
- t=clock();
- //goto f;
- int y=0;
- int f[16];
- memset(f,0,15*4);
- for (int i=0;i<c_2;i++)
- {
- for(int j=0;j<4;j++)
- {
- //int key=(k[i]&mask[j])+null[j];
- //if(key_recn2[o[j]].find(key)!= key_recn2[o[j]].end())
- {f[o[j]]++;
- int recn=key_recn2[o[j]][(k[i]&mask[j])+null[j]]-c_2;
- k2[recn]=(k[i]&mask[j])+null[j];
- C2[recn]+=C[i];
- v3[recn]+=v2[i];
- y=recn;
- }
- }
- }
- for(int i=1;i<7;i++)
- {
- if (i==1)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x0FFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
- /* {f[3]++;
- int recn=key_recn2[3][key]-c_2;
- k2[recn]=key;
- C2[recn]+=C2[(iter->second)-c_2];
- v3[recn]+=v3[(iter->second)-c_2];
- }*/
- sumkey(3);
- key=((iter->first)&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
- sumkey(9);
- key=((iter->first)&0x0F00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
- sumkey(5);
- }
- if(i==2)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
- sumkey(10);
- }
- if(i==4)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0x0F0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
- sumkey(6);
- key=((iter->first)&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
- sumkey(12);
- }
- if(i==3)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
- sumkey(11);
- key=((iter->first)&0x0F000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
- sumkey(7);
- key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
- sumkey(15);
- }
- if(i==5)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
- sumkey(13);
- }
- if(i==6)
- for(iter=key_recn2[i].begin();iter != key_recn2[i].end(); iter++)
- {
- int key=((iter->first)&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
- sumkey(14);
- }
- }
- printf("汇总后面节点%dms,recn=%d,每毫秒读%d行,每毫秒写%d行\n",clock()-t,c,c_2/(clock()-t),(c-c_2)/(clock()-t));
- t=clock();
- /*
- printf("%fms,recn=%d,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%I64d\n",(float)(clock()-t)/CLOCKS_PER_SEC ,c,
- (k2[y]>>24),((k2[y]>>16)&255),((k2[y]>>8)&255),(k2[y]&255),C2[y],v3[y]);
- */
- FILE *fp=fopen("out.txt","wb");
- //fp=fopen("out.txt","wb");
- fprintf(fp,"gid,c1,c2,c3,c4,count,sum\n");
- for (int i=0;i<c_2;i++)
- {
- y=i;
- fprintf(fp,"%d,%d,%d,%d,%d,%d,%I64d\n",
- 0,(k[y]>>24),((k[y]>>16)&255),((k[y]>>8)&255),(k[y]&255),C[y],v2[y]);
- }
- for (int i=0;i<c-c_2;i++)
- {
- y=i;
- fprintf(fp,"%d,%d,%d,%d,%d,%d,%I64d\n",
- (16+((k2[y]>>24)>>4))&15,(k2[y]>>24)&15,((k2[y]>>16)&255),((k2[y]>>8)&255),(k2[y]&255),C2[y],v3[y]);
- }
- fclose(fp);
- printf("保存到文件%dms,recn=%d,每毫秒写%d行\n",clock()-t,c,c/(clock()-t));
- t=clock();
- f:
- free(c1);
- free(c2);
- free(c3);
- free(c4);
- free(v1);
- free(v2);
- free(C);
- free(k);
- free(C2);
- free(k2);
- free(v3);
- printf("释放所有动态内存%dms,%d\n",clock()-t,c);
- for(int i=0;i<16;i++)
- printf("%d,%d\n",i,f[i]);
- }
- return 0;
- }
复制代码
D:\lt\dl>map7
9,97,119,114,11843118
申请源表内存0ms
填充源表数据62ms,recn=0,每毫秒16129行
新建一层节点453ms,recn=1000000,每毫秒读2207行,每毫秒写2207节点
申请一层内存0ms
写入一层数据219ms,recn=1000000,每毫秒读4566行,每毫秒写4566行
新建后面节点1531ms,recn=2299600,每毫秒读653行key,每毫秒写848节点
0,first=3D454D41,renc=0
1,first=1000007F,renc=1397076
2,first=20007F00,renc=1381362
3,first=30007F7F,renc=2260123
4,first=407F0000,renc=1431349
5,first=507F007F,renc=2260125
6,first=607F7F00,renc=2284774
7,first=707F7F7F,renc=2284669
8,first=8F000001,renc=1549286
9,first=9F00007F,renc=2260124
10,first=AF007F00,renc=2273610
11,first=BF007F7F,renc=2284668
12,first=CF7F0000,renc=2284775
13,first=DF7F007F,renc=2299366
14,first=EF7F7F00,renc=2299485
15,first=FF7F7F7F,renc=2299599
申请后面内存15ms,2299600
汇总后面节点1563ms,recn=2299600,每毫秒读639行,每毫秒写831行
保存到文件2422ms,recn=2299600,每毫秒写949行
释放所有动态内存0ms,2299600
0,0
1,1000000
2,1000000
3,103887
4,1000000
5,103887
6,122094
7,873
8,1000000
9,103887
10,99522
11,873
12,122094
13,1071
14,1026
15,873
D:\lt\dl>dir out.txt
2010-02-28 13:59 52,396,878 out.txt
---------------
很奇怪,服务器又比笔记本慢
D:\app>map7
9,97,119,114,11843118
申请源表内存0ms
填充源表数据46ms,recn=0,每毫秒21739行
新建一层节点656ms,recn=1000000,每毫秒读1524行,每毫秒写1524节点
申请一层内存31ms
写入一层数据312ms,recn=1000000,每毫秒读3205行,每毫秒写3205行
新建后面节点2636ms,recn=2299600,每毫秒读379行key,每毫秒写493节点
0,first=6C694620,renc=0
1,first=1000007F,renc=1397076
2,first=20007F00,renc=1381362
3,first=30007F7F,renc=2260123
4,first=407F0000,renc=1431349
5,first=507F007F,renc=2260125
6,first=607F7F00,renc=2284774
7,first=707F7F7F,renc=2284669
8,first=8F000001,renc=1549286
9,first=9F00007F,renc=2260124
10,first=AF007F00,renc=2273610
11,first=BF007F7F,renc=2284668
12,first=CF7F0000,renc=2284775
13,first=DF7F007F,renc=2299366
14,first=EF7F7F00,renc=2299485
15,first=FF7F7F7F,renc=2299599
申请后面内存47ms,2299600
汇总后面节点2683ms,recn=2299600,每毫秒读372行,每毫秒写484行
保存到文件2387ms,recn=2299600,每毫秒写963行
释放所有动态内存0ms,2299600
0,0
1,1000000
2,1000000
3,103887
4,1000000
5,103887
6,122094
7,873
8,1000000
9,103887
10,99522
11,873
12,122094
13,1071
14,1026
15,1000
^C
D:\app>
[ 本帖最后由 〇〇 于 2010-3-1 13:14 编辑 ] |
|