只能分塊處理了,讀入一塊、處理一塊、存儲一塊,資料庫就是這么乾的。
❷ 如何用c語言高效的讀取一個很大的txt數據文件
#include <stdio.h>
#include <string.h>
#define MAXSIZE 4000000
struct password {
char psw[12]; // 密碼名稱
int counter; // 出現次數計數器
};
int Append(struct password a[], int *n, char psw[]) {
int i;
for(i = 0; i < *n; ++i) {
if(strcmp(a[i].psw,psw) == 0) {
++a[i].counter;
return 2;
}
}
if(*n < MAXSIZE) {
strcpy(a[*n].psw,psw);
a[*n].counter = 1;
++(*n);
return 1;
}
return 0;
}
int main() {
struct password a[MAXSIZE];
char psw[12];
int i,n = 0,id;
char infilename[] = "indata.txt";
char outfilename[] = "outdata.txt";
FILE *inf,*outf;
if((inf = fopen(infilename,"rt")) == NULL) {
printf("不能打開數據文件:%s。\n",infilename);
return 1;
}
while(fscanf(inf,"%d %11s",&id,psw) == 2) {
if(Append(a,&n,psw) == 0) break;
}
fclose(inf);
if((outf = fopen(outfilename,"wt")) == NULL) {
printf("不能打開數據文件:%s。\n",outfilename);
return 2;
}
for(i = 0; i < n; ++i)
fprintf(outf,"%s %d\n",a[i].psw,a[i].counter);
fclose(outf);
return 0;
}
估計可能是數組越界,修改如下:
int Append(struct password a[], int *n, char psw[]) {
int i;
for(i = 0; i < *n && i < MAXSIZE; ++i) {
if(strcmp(a[i].psw,psw) == 0) {
++a[i].counter;
return 2;
}
}
if(*n < MAXSIZE) {
strcpy(a[*n].psw,psw);
a[*n].counter = 1;
++(*n);
return 1;
}
return 0;
}
❸ C語言高速讀大文件、寫大文件的方式
寫文件一般是追加快些
如果你要輸出例如XML。
還有,每個進程應該有4G,靠操作系統內版存管理+頁面文件權維持、
還有,開個幾百M的數組不劃算、用malloc+free快些,可以動態的,不讓操作系統在載入時就開辟幾百M,而是陸續的開——除非你在寫匯編程序——匯編向OS申請內存很費勁,要 SYSCALL
❹ C語言快速讀取超大數組的問題
關鍵不在於你要把它讀進去。
而在於:
1.文件哪來的,有辦法不用那麼大的文件么?建立文件的時候不能建立一個索引么?或者用一個便於訪問的格式么?
2.文件要用來干什麼?CPU一次只能處理幾個位元組,你為什麼要把它全讀到內存里呢?
如果第1條不能解決,也就是最壞的情況,那麼建議:
做一個轉換器,把原始文件轉換成便於操作的文件再進行處理。所謂便於操作,就是說,每一行數據的大小固定,因而可以對數據進行快速訪問。轉一行存一行,不會花太多內在。需要一定的轉換時間,但是因為可以預估,所以界面上可以做一個轉換進度來降低用戶的主觀等待時間。
PS:至於你是把轉換後的數據存到文件進行訪問,還是用映射的方式把文件映射到內存來讀寫,實質上差不多,不過後者可能有系統提供的緩存機制來提高效率。但是本質上一樣的:轉換成臨時文件、使用;或者乾脆就是用專門的程序轉換出新文件,再用處理程序去處理。看場合了。
如果你的文件是存儲在順序存儲器中,比如磁帶上:
那麼差不多意思,想辦法把數據轉存到你的磁碟上,然後再進行隨機訪問。
補充::::關於內存映射:見上面的PS內容,先把文件轉成可隨機訪問格式(比如我說要哪一行數據,你就立刻能找到/算出,而不是從頭一行一行去找),然後再做內存映射。
另外,Windows下和Linux下的內存映射有所不同,但是基本上不難,可以直接搜索找到照搬。
❺ 如何使用C語言實現大數據體的動態讀取與處理
在內存中開辟兩個緩存區,大小?比如每個緩存32M,然後將數據讀入輸入緩存處理版,處理後的結果送輸權出緩存
這里的關鍵問題是如何對緩存進行管理?總體思路是,當緩存中有數據時,則取數據進行處理,處理好後放輸出緩存,同時還必須檢測,當輸出緩存數據快滿時,能夠及時將數據送入硬碟。。。
上面是大體思路,實際中,一般運用多線程處理這種情況,即一個線程負責管理輸入緩存,一個線程負責管理輸出緩存,第三個線程負責數據處理。。。具體管理策略有很多,你需要綜合各種因素(比如時間寬余度等)來決定。。。
❻ c語言如何輸入很大的數據
測試數據一定是保存在文件中的
只要使用while語句,分段把數字讀出來,然後各位數相加,再mod 3求余
可以讀一段,把這些數字相加,然後再求余,然後再讀一段。。。
這樣的過程,就可以把超大數據解決了~