在linux下读一个巨大的日志文件, 2.4G
用正文文件的方式打开, 一行一行的读
char achbuf[ 4096 ] ; ifstream ifile( "/cygdrive/h/logs/zz/ex051117.log" ) ; if ( !ifile ) { cout << "error in opening" << endl ; return -1 ; } int i ; for( i = 0 ; !ifile.eof() ; i++ ) { ifile.getline( achbuf , sizeof( achbuf ) - 1 ) ; }
这个过程用了51秒
2.4G的文件用51秒, 47M每秒, 已经接近硬盘的最高速度了.
当时想做个尝试, 看看用二进制方式打开一次读入16M能否会更快.
char achbuf[ 4096 * 4096 ] ; ifstream ifile( "file.log" , ios::in | ios::binary ) ; if ( !ifile ) { cout << "error in opening" << endl ; return -1 ; } int i ; for( i = 0 ; !ifile.eof() ; i++ ) { ifile.read( achbuf , sizeof( achbuf ) ) ; }
这个过程竟然用了96秒!!!!!!!!!!
到论坛请教了一下, co给出一个链接: Fast read of binary files that alternate type
试了试co推荐的文章里说的方法, 加了 ifile.imbue( std::locale::classic());, 结果为88秒, 有提高.
改用下面的代码读是54秒, 和第一个速度相近了
FILE *pfile ; pfile = fopen( "file.log" , "rbS" ) ; if ( pfile == NULL ) { cout << "error in opening" << endl ; return -1 ; } int i ; for( i = 0 ; !feof( pfile ) ; i++ ) { fread( achbuf, 1 , sizeof( achbuf ) , pfile ) ; //16M } fclose( pfile ) ;
刚开始学习stl,不太清楚stl文件io实现的内部机制, 不清楚为什么二进制和正文文件的读入速度差这么多.
有知道的请不吝赐教. 有能答疑解惑者,赠烤鸭一只