行数を見つける唯一の方法は、ファイル全体を読み取り、行末文字の数を数えることです。これを行う最も速い方法は、おそらく、1 回の読み取り操作でファイル全体を大きなバッファーに読み取り、次にバッファーを調べて '\n' 文字をカウントすることです。
現在のファイル サイズは約 60Mb であるため、これは魅力的なオプションではありません。ファイル全体を読み取るのではなく、チャンクで読み取ることで、ある程度の速度を得ることができます。たとえば、サイズは 1Mb です。また、データベースは問題外だとおっしゃっていますが、長期的には最善のソリューションのように見えます。
編集:これについて小さなベンチマークを実行したところ、バッファリングされたアプローチ(バッファサイズ1024K)を使用すると、getline()で一度に1行読むよりも2倍以上速いようです。これがコードです - 私のテストは -O2 最適化レベルを使用して g++ で行われました:
#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;
}