c处理大数据
Ⅰ C/C++大数据处理:10Gtxt数据库文件
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为寻找的子串长度,计算长度时需要特殊考虑,我简略了该种情况
Ⅱ java和c谁适合大数据
属于开放源代码的Java编程的C程序是没有的。目前有超过28个Java编辑器,所以做Java的比较简单,但兼容性差,对于Java程序类似手机特别开发。和C只有四家公司做的更好的兼容性,和C可以做很多的Java不了。所以C应该更重要,也更难以学习。
Ⅲ 怎么用c语言处理大数据
只要内存够大,可以读取2万行数据的,我上次写了个程序读取了240万条数据到内存之中。
你只要用getline函数,和strtok函数配合使用就行了,只能读取6000行数据可能是你程序写的有问题。
Ⅳ C语言基础,大数据的输入和输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX101
intcheck(char*a){
inti,n,k=1;
n=strlen(a);
for(i=0;i<n;i++)
if(a[i]>'9'||a[i]<'0'){
k=0;
break;
}
returnk;
}
intplus(char*a,char*b,int*s){
inti,j,n,m,t,k=0;
//printf("%s %s ",a,b);
i=strlen(a)-1;
j=strlen(b)-1;
t=0;
while(i>=0&&j>=0){
t=t+a[i--]-'0'+b[j--]-'0';
s[k++]=t%10;
t=t/10;
}
if(t&&(i!=j))
s[k]=t;
if(t&&(i==j))
s[k++]=t;
while(i>=0){
s[k]+=a[i--]-'0';
k++;
}
while(j>=0){
s[k]+=b[j--]-'0';
k++;
}
for(i=k-1;i>=0;i--){
printf("%d",s[i]);
}
printf(" ");
returnk;
}
intmain(intargc,char*argv[]){
chara[MAX],b[MAX];
intc[MAX+2]={0};
scanf("%s%s",&a,&b);
//printf("%s %s ",a,b);
if(check(a)&&check(b))
plus(a,b,c);
else
printf("error ");
return0;
}
Ⅳ c语言处理文件里的大数据
只能分块处理了,读入一块、处理一块、存储一块,数据库就是这么干的。
Ⅵ C语言大数据问题
给你提个思路吧,这种大数据都必须用数组来做的。把数字直接定义成数组,然后将转换规则写成代码,而不是直接用取余或取整来做。我给你上传一个大数加法的代码,给你些启发吧。想要代码可以先点赞我,然后我给你写一个进制转换的代码。你这分太少,多些我会直接给你写个代码的。
Ⅶ c语言文件处理:大数据排序,我知道用ftell,fwrite...归并排序,但如何实现
如果你不想把硬盘搞坏,不要直接操作文件读写排序,大数据而且速度也会很慢。
建议把文件数据读入到动态分配内存,再进行数据排序,排序完成后,再写入到文件,这样做速度性能快。按你代码那样不停读写硬盘来实现排序,是非常不好的方式,因为硬盘是比较慢的设备,导致程序排序起来非常慢,频繁读写硬盘对硬盘寿命也有影响。
排序方法有很多种,快速排序在大数据排序方面性能比较理想。
Ⅷ c/c++对大数据有用吗
cloudera自己的大数据生态就是C++的, 比如Impala,ku。
java 把写大规模并发程序的难度降低了,但是把问题挪到了JVM上面,虽然内存分配省心了,但是问题在JVM上面表现出来了。
C++ 是写的时候难了,但是用起来爽
GO 的话,并发解决了, GC问题还是没解决 和java 一样一样的!
Ⅸ 用C语言实现大数据的加减运算(基本类型无法储存的大数据,使用字符串解决)。
#include"stdio.h"
#include<string.h>
intmain(intargv,char*argc[]){
chara[]="";
charb[]="",*pa,*pb;
inti,j,k,la,lb;
if((la=strlen(a))>=(lb=strlen(b)))
=a,pb=b;
else{
pa=b,pb=a;
i=la,la=lb,lb=i;
}
printf("%s+%s =",a,b);
for(i=la-1,j=lb-1;j>=0;pa[i--]+=pb[j--]-'0');
for(i=la-1;i>0;i--)
if(pa[i]>'9')
pa[i]-=10,pa[i-1]++;
if(pa[0]>'9'){
printf("1");
pa[0]-=10;
}
else
for(;pa[i]=='0';i++);
printf("%s ",pa+i);
printf(" %s-%s =",a,b);
for(i=la-1,j=lb-1;j>=0;pa[i--]-=pb[j--]-'0');
for(i=la-1;i>0;i--)
if(pa[i]<'0')
pa[i]+=10,pa[i-1]--;
if(pa[0]<'0'){
printf("-");
pa[0]+=1;
}
else
for(;pa[i]=='0';i++);
printf("%s ",pa+i);
return0;
}
运行结果:
Ⅹ 如何使用C语言实现大数据体的动态读取与处理
在内存中开辟两个缓存区,大小?比如每个缓存32M,然后将数据读入输入缓存处理,处理后的结果送输出缓存
这里的关键问题是如何对缓存进行管理?总体思路是,当缓存中有数据时,则取数据进行处理,处理好后放输出缓存,同时还必须检测,当输出缓存数据快满时,能够及时将数据送入硬盘。。。
上面是大体思路,实际中,一般运用多线程处理这种情况,即一个线程负责管理输入缓存,一个线程负责管理输出缓存,第三个线程负责数据处理。。。具体管理策略有很多,你需要综合各种因素(比如时间宽余度等)来决定。。。