问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-07-28 19:44

我来回答

2个回答

热心网友 时间:2024-10-29 06:31

10G 连一次导入内存都不行,而且你说的串除了出现1次没有其他特征,只能文件分块读入用KMP匹配
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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为寻找的子串长度,计算长度时需要特殊考虑,我简略了该种情况

热心网友 时间:2024-10-29 06:31

算法考虑:(假设要找字符串:student123)

每次读入固定数量的字符,比如10k,直到找到字符串或文件结束,最后一次有可能读入少于10k个字符;

在读入的数据中查找要查找字符串的第1个字符's',如找到则进行逐字符比较,遇到不同字符停止检测,直到比较完全相符

如遇到疑似合法字符串处于跨区位置,需要将下一个10k读进来接着判断

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做青红椒炒毛肚有哪些好吃的诀窍? 如何自制好吃的香辣毛肚? 穿越火线警告码SX(2,509,0)如何解决 CF sx警告码(2,770,0)什么原因 ...要求重新启动电脑 警告码是2 xxxx 0 有时重启4 5次才能玩 win7系统... 穿越火线 sx 警告码 2,994,0 怎么解决 CF出现非法模块SX警告码(2,990,0) 我为什么上CF体验服没开G有非法模块???怎么办啊 警告码(2,502,0) 穿越火线进游戏后 2分钟左右 就出来个 SX 警告码2,990,0 看到刘老师那慈祥的面庞,我感慨万分,我想到了这样几个赞美刘老师的成语... 土豆长了芽能吃吗?土豆长了芽怎么办? 饱受妇科炎症骚扰的闺蜜,我怎么做才能帮帮她? 申民哲下药女友闺蜜电影叫什么? 我爱上我闺蜜了,可她不喜欢我,有什么解决方法吗? 闺蜜被人下药讹钱怎么办? wan接口接什么线 手机没用多久就很烫怎么回事 LOL 腾讯花了多少钱买来运营 怎么做菠萝泡芙呢 制做盐卤豆腐怎样做才有产量 一个手机号怎样开两个? 佛地葬罗衣的意思是什么 一团橡皮泥,有人第一次把它捏成长方体,第二次把它捏成球,捏成的两个... 有一团橡皮泥,小光第一次把它捏成长方体,第二次把它捏成球。捏成的两... 一团橡皮泥,第一次把它捏成长方体,第二次把它捏成求,捏成的两个物体那 ... ...小明第一次把它捏成长方体,第二次捏成球,捏成的两个物体哪一个体积... 一团橡皮泥,小明第一次帮他捏成长方体,第二次把它捏成球,捏成的两个... 一团橡皮泥,小明第一次把它捏成长方体,第二次把它捏成球,球的体积大... 一团橡皮泥,小华第一次把它捏成长方体,第二次捏成球。捏成的长方体和... 梦见派出所的人是什么意思 重庆市职工医保缴费标准2023年 增强短信是什么意思 开启增强信息什么意思 win10下cf不能全屏解决方案是什么 那个联通定制的3g手机(索尼M1i)怎样设置用移动的2g卡上网 索尼爱立信 M1i手机,才买1天,不太会玩,遇到2次黑屏,按键盘有反映,但是... 如何分辨上市公司资产重组情况 省呗审核一般要多久? 我名字里带有一个“斌”字的,大家帮我想想英文名吧,就是要和斌同调的... 杨益斌的英文名叫什么 小斌英文名什么打啊!谢谢啊! 小年说的祝福语 度量衡中的“衡”是指哪个方面的标准?( ) 瑞鹧鸪的网络解释瑞鹧鸪的网络解释是什么 瑞鹧鸪的意思瑞鹧鸪的意思是什么 是当鸡头,还是凤尾 过期的身份证可以分期付款买手机吗 按法律规定身份证过期可不可以办手机分期付款? 身份证到期了还能办理手机分期吗 身份证到期了 还可以分期购买手机吗