如何快速处理大量数据
各位大侠,大家用c/c++编程时,没有用到数据库管理系统,那么是通过那几种常用的途径来提高处理大量数据的速度呢?除了优化算法,提高硬件设施等技术手段,另外想问一下采用多线程设计可以最大程度上提高多少速度?一位菜鸟的问题------望各位指点迷津,不甚感激!!!!!!!
[解决办法]
比如说两个线程,一个向缓冲区写数据一个从缓冲区度数据,两个同时工作的时候当然要比写完再读要快1倍多,再比如说,要查找一个数据一个线程从头查找一个从尾部开始查找,最坏的情况这个数据刚好在中间,那也不会慢,若是这个数据在末尾,那查询的速度就是SO SO的。
[解决办法]
需要首先分析问题的瓶颈在哪里,然后才能谈解决方案~~
假如IO是瓶颈,线程多了可能反而效率低了呢~~
[解决办法]
可能会用到线程池,参考boost::threadpool
可能会用到内存池,参考boost::pool
在线程池中,可以控制最多同时运行的线程数量(跟cpu核数有关),可以设置每个线程的运行优先级。
[解决办法]
多线程是必须的。
数据库操作,如果是c/s模式的,加速的话,存储过程是必须的。
如果是嵌入式数据库,可能选型很重要,找一款速度快的。
另外还要看你如何处理,系统瓶颈在哪? 在算法还是在IO,如果在算法就简单了,升级CPU吧。
在IO上,硬件也可以升级成SSD硬件。
如果瓶颈在大规模并发上,可能要考虑分布式架构
[解决办法]
void * Test(void *arg)pthread_create(&Pid[i],NULL,Test,NULL);for(i=0;i<Num; i++){ pthread_join(Pid[i],NULL);}
[解决办法]
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST#include <stdio.h>#include <string.h>#include <stdlib.h>#include <search.h>#define MAXLINES 1000000#define MAXCHARS 256char buf[MAXLINES][MAXCHARS];char P[256]="PROG";//程序Program需要的文件列表char L[256]="LIST";//dir /b /s生成的实际文件列表ListFILE *fp,*fl;int c,n,L1,hh;int ignore_case=0;char ln[MAXCHARS];int icompare(const void *arg1,const void *arg2) { return stricmp((char *)arg1,(char *)arg2);}int compare(const void *arg1,const void *arg2) { return strcmp((char *)arg1,(char *)arg2);}int main(int argc,char **argv) { if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写 if ((fl=fopen(L,"rt"))==NULL) { fprintf(stderr,"Can not open %s\n",L); fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]); return 1; } if ((fp=fopen(P,"rt"))==NULL) { fclose(fl); fprintf(stderr,"Can not open %s\n",P); return 2; } n=0; hh=0; while (1) { if (fgets(ln,MAXCHARS,fl)==NULL) break;// hh++; L1=strlen(ln)-1; if ('\n'!=ln[L1]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",L,hh,MAXCHARS); while (1) { c=fgetc(fl); if ('\n'==c || EOF==c) break;// } } while (1) {//去掉行尾的'\n'和空格 if ('\n'==ln[L1] || ' '==ln[L1]) { ln[L1]=0; L1--; if (L1<0) break;// } else break;// } if (L1>=0) { strcpy(buf[n],ln); n++; if (n>=MAXLINES) { fclose(fl); fclose(fp); fprintf(stderr,"%s up to %d lines",L,MAXLINES); return 3; } } } fclose(fl); if (ignore_case) qsort(buf,n,MAXCHARS,icompare); else qsort(buf,n,MAXCHARS,compare); hh=0; while (1) { if (fgets(ln,MAXCHARS,fp)==NULL) break;// hh++; L1=strlen(ln)-1; if ('\n'!=ln[L1]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",P,hh,MAXCHARS); while (1) { c=fgetc(fp); if ('\n'==c || EOF==c) break;// } } while (1) {//去掉行尾的'\n'和空格 if ('\n'==ln[L1] || ' '==ln[L1]) { ln[L1]=0; L1--; if (L1<0) break;// } else break;// } if (L1>=0) { if (ignore_case) { if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln); } else { if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln); } } } fclose(fp); return 0;}