Posts tagged: io

在linux下一个有趣的STL文件IO问题

在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实现的内部机制, 不清楚为什么二进制和正文文件的读入速度差这么多.
有知道的请不吝赐教. 有能答疑解惑者,赠烤鸭一只smile_tongue

Tags: , , ,

categories IT