最近在做一点练习,顺便学习c语言,发现些有趣的现象.若大家有什么见解请直言,学习,学习
环境:一个200M的文本文件,文件中每一行大约200个字符,以"/n"结束,共160w条数据,循环读入每一行数据,进行必要的分析
把必要的行按行里的key值保存到不同的文本文件中,这些要保存的行大约占200M文件的80%.
1:读的方式:
请不要getline方法,160w行数据会读死你的,请按块读
关键代码如下:
#include <fstream>
#include <assert.h>
void readfile()
{
size_t size= 1024*1024*50;
char *plog = new char[size];
ifstream in;
in.open("log.txt",ios::in);
assert(in);
char *ptr;
size_t length = 0;
size_t real_size = size;
while(!in.eof)
{
in.read(plog,size);
plog -= length;
//这里开始处理
//^&*%^&$&^%
//规整数据,以下代码不保证正确性,请自行测试,整理的数据最后行可能是错误数据,处理时丢弃
ptr = strrchr(plog,'/n');
memmove(plog,ptr,strlen(ptr));
length = strlen(ptr);
if(length > 0)
{
plog +=length;
real_size = size - length;
}
else
{
length = 0;
real_size = size;
}
}
}
2:strcat的速度在反复使用中没有memcpy快
如果读到的行需要保存,一行一行的写显然不是很好,这时,需要申请一块内存,等等把他写满了再写出去,明显要提高效率.
方法:使用strcat或memcpy把那行数据复制到申请的char *pParserLog中,等满了"倒出去",具体代码明天放出.
3:如果申请的内存比较大,把他写满花的时间是成几何级数长的,相反使用几百卡(50k左右相当理想)时速度相当快.
测试了下,写满50k需要0.01秒,1M需要2秒.这个结果相当无语.于是,我使用了"缓存"方式,比较恶心的方式.
方法如下:申请两块内存,一块5M,一块50K,先写入50K的,50K的写满后,把数据推入5M中,如此循环,当5M写满后才把5M
的数据写入磁盘文件中,具体代码明天放出.