- 论坛徽章:
- 0
|
Hi
本人想写一个处理速度更高的文件处理程序
特此请教!
下面代码只是每次读取文件一行来处理
将一个大文件(例如10G),拆分成500个表来保存
文件内容是
4,53,62
6553,5,42
853,65,45
722,55,74
......
...
想更高效率就需要每次取 几M 到内存再处理
所以下面代码有待改善
有人能分享下怎样从这个大文件抽取 几M(1M或5M)到内存再进行处理吗???(我代码是对每行的 , 之前的数字取模,按照模数来分表)
或者有人有更好的想法吗?
关于处理大文件的想法欢迎一起讨论!
谢谢!
- #include <iostream>
- #include <fstream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- using namespace std;
- //找到 , 之前的数字
- int GetNumber(char *text, char c)
- {
- int len = strlen(text);
- int num = 0;
- int k = 1;
- int i = 0;
- for(i=0;i<len;i++)
- {
- if(text[i]==c)
- {
- break;
- }
- }
- i--;
- for(;i>=0;i--)
- {
- num = num + (text[i] - '0') * k;
- k *= 10;
- }
- return num;
- }
- //参数:要打开的文件名+拆分文件数
- int main(int argc, char *argv[])
- {
- if(argc <= 1)
- {
- cout<<"Input File Name"<<endl;
- return -1;
- }
- ifstream in(argv[1]);
- char out_file_name[260];
- ofstream *out = new
- ofstream[atoi(argv[2])];///atoi
- for(int i=0;i<atoi(argv[2]);i++)///atoi
- {
- sprintf(out_file_name, "./test/test%d.txt", i+1);//这里修改输出地址
- out[i].open(out_file_name);
- }
- char s[128];//拆分后文件每行的宽度
- int score_split;//保存取模之后结果,可以用作输出文件索引号
- while(in.getline(s, 128))
- {
- int score_split_line = GetNumber(s, ',');
- score_split = score_split_line%atoi(argv[2]);////atoi
- out[score_split].write(s, strlen(s) +1);//按照索引号将匹配到的行内容输出到对应的文件里
- out[score_split]<<endl;
- }
- for(int i=0;i<atoi(argv[2]);i++)////atoi
- {
- out[i].close();//关闭打开的文件流
- }
- in.close();
- return 0;
- }
复制代码 |
|