永发信息网

C/C++大数据处理:10Gtxt数据库文件

答案:2  悬赏:50  手机版
解决时间 2021-02-18 22:51
有一个10G的txt文件,以特定的格式存放着大量的数据库信息,请问:怎么写一个程序找到特定的字符串。

假如有这么一文件:大小为10G,存放着大量的文章,全部都是课文,现在找特定一句话,求一种方法,能最快找到特定的这句话。(这句话只在整个文档中出现一次)

关键是代码,一定要有能运行的代码。思路我也知道
最佳答案
10G 连一次导入内存都不行,而且你说的串除了出现1次没有其他特征,只能文件分块读入用KMP匹配
#include
#include
#include
#define MAX 1024*1024*10
int index_KMP(char *s,int n,char *t,int pos);
//利用模式串的t的next函数求t在主串s中的第pos个位置之后的位置的KMP算法(t非空,1<=pos<=Strlength(s))。

void get_next(char * t,int * next);
//求模式串t的next函数的并存入数组next[]中。
int next[MAX];
int main()
{
char* s= (char*)malloc(MAX+1);
memset(s,0,MAX+1);
char t[256]={0},c;
printf("请输入检测字符串,以#号结尾");
int i=0;
while((c=getchar())!='#'&&i<256)
{
t[i++]=c;
}
fflush(stdin);
//strcpy(t,"2014-04-28 18:14:33,333");
get_next(t,next);
FILE* pf = NULL;
if((pf = fopen("1.txt","r"))==NULL){
printf("打不开文件!\n");
return 0;
}
int cur=0,n=0;
unsigned long long pos=0,sum=0;
while(!feof(pf))
{
int len = fread(s,1,MAX,pf);
sum+=len;
printf("读取第 %5d 次,长度 %5d ,总长:%ld\n",cur+1,len,sum);
n=index_KMP(s,MAX,t,pos);
if(n>0)
{
pos = n+cur*MAX;
break;
}
++cur;
}
fclose(pf);

free(s);
if(n!=0)
printf("\n模式串 t 在主串 s 中第 %ld 个位置之后。\n\n",n);
else
printf("\n主串中不存在与模式串相匹配的子串!\n\n");

}

int index_KMP(char *s,int n,char *t,int pos)
//利用模式串的T的NEXT函数求t在主串s中(长度n)的第pos个位置之后的位置的KMP算法,(t非空,1<=pos<=Strlength(s)).
{
int i=pos,j=1;
while (i<=n &&j<=(int)strlen(t))
{
if (j==0 || s[i]==t[j-1]) //继续进行后续字符串的比较
{
i++;
j++;
}

else j=next[j]; //模式串向右移动
}
if (j>(int)strlen(t)) //匹配成功
return i-strlen(t)+1;
else //匹配不成功
return 0;
}

void get_next(char *t,int *next)
//求模式串t的next函数的并存入数组next[]中。
{
int i=1,j=0;
next[0]=next[1]=0;
while (i<(int)strlen(t))
{
if (j==0 || t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
替换文件名,每次读10M,我测试50M的1S搞定,因为寻找串可能再两次读取之间,完美的做法是后一次要把前一次的最后N个字符重新读取,N为寻找的子串长度,计算长度时需要特殊考虑,我简略了该种情况
全部回答
你好! 算法考虑:(假设要找字符串:student123) 1. 每次读入固定数量的字符,比如10k,直到找到字符串或文件结束,最后一次有可能读入少于10k个字符; 2. 在读入的数据中查找要查找字符串的第1个字符's',如找到则进行逐字符比较,遇到不同字符停止检测,直到比较完全相符 3. 如遇到疑似合法字符串处于跨区位置,需要将下一个10k读进来接着判断 如有疑问,请追问。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
狄庄在什么地方啊,我要过去处理事情
热水袋什么牌子好。介绍个。安全稳定的
形容奢华而不奢侈的词语 谢兄弟姐妹帮忙了 辛
雅途教育都江堰校区这个地址在什么地方,我要
油漆中含甲醛吗
为什么他发表说说,删人删的手痛好久没有人联
寻找一个成语?形容工作中要继承发扬好的经验,
长宏软包在什么地方啊,我要过去处理事情
我有一个ipad mini 是最早买的。现在有了苹果
如何验证物体的静摩擦力比滑动摩擦力大急
云舒茶苑地址在什么地方,想过去办事
上比天高下比地高(打一成语'
电脑u盘插口松了怎么办
求平方表,立方表,平方根表如题.平方表最好写
咸阳机场怎么去宝鸡麟游县..急急急..
推荐资讯
有一长方形木块,切成A,B两块,质量分别为ma,mb
飞傲x7上下两个lo po耳机孔有什么区别
康城花园祥和苑在什么地方啊,我要过去处理事
中老年理发店地址在什么地方,想过去办事
qq梦之队传奇球员都有谁??要所有传奇球星的
781天等于几年几个月
94年农历2月12号是什么星座。不要不要乱答哦
下列哪种认识是不正确的?BA. 青春期是学知识
费用明细帐记帐格式问题
英雄联盟补丁是什么
电脑自动更新程序中途不小心断电了,然后起不
天韵神悦音乐会所在什么地方啊,我要过去处理
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?