找到行数的唯一方法是读取整个文件并计算行尾字符的数量。最快的方法是通过一次读取操作将整个文件读入一个大缓冲区,然后通过缓冲区计算 '\n' 字符。
由于您当前的文件大小约为 60Mb,因此这不是一个有吸引力的选择。您可以通过不读取整个文件来获得一些速度,而是以块的形式读取它,例如大小为 1Mb。您还说数据库是不可能的,但它确实看起来是最好的长期解决方案。
编辑:我刚刚对此进行了一个小型基准测试,使用缓冲方法(缓冲区大小 1024K)似乎比使用 getline() 一次读取一行的速度快两倍多。这是代码 - 我的测试是使用 g++ 使用 -O2 优化级别完成的:
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
using namespace std;
unsigned int FileRead( istream & is, vector <char> & buff ) {
is.read( &buff[0], buff.size() );
return is.gcount();
}
unsigned int CountLines( const vector <char> & buff, int sz ) {
int newlines = 0;
const char * p = &buff[0];
for ( int i = 0; i < sz; i++ ) {
if ( p[i] == '\n' ) {
newlines++;
}
}
return newlines;
}
int main( int argc, char * argv[] ) {
time_t now = time(0);
if ( argc == 1 ) {
cout << "lines\n";
ifstream ifs( "lines.dat" );
int n = 0;
string s;
while( getline( ifs, s ) ) {
n++;
}
cout << n << endl;
}
else {
cout << "buffer\n";
const int SZ = 1024 * 1024;
std::vector <char> buff( SZ );
ifstream ifs( "lines.dat" );
int n = 0;
while( int cc = FileRead( ifs, buff ) ) {
n += CountLines( buff, cc );
}
cout << n << endl;
}
cout << time(0) - now << endl;
}