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,然後將數據讀入輸入緩存處理,處理後的結果送輸出緩存
這里的關鍵問題是如何對緩存進行管理?總體思路是,當緩存中有數據時,則取數據進行處理,處理好後放輸出緩存,同時還必須檢測,當輸出緩存數據快滿時,能夠及時將數據送入硬碟。。。
上面是大體思路,實際中,一般運用多線程處理這種情況,即一個線程負責管理輸入緩存,一個線程負責管理輸出緩存,第三個線程負責數據處理。。。具體管理策略有很多,你需要綜合各種因素(比如時間寬余度等)來決定。。。