只能分块处理了,读入一块、处理一块、存储一块,数据库就是这么干的。
❷ 如何用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求余
可以读一段,把这些数字相加,然后再求余,然后再读一段。。。
这样的过程,就可以把超大数据解决了~