2

log4cpp 形式で書き込まれたログ ファイルがいくつかあります。

--log4cpp の性質上、このファイルは各行の先頭が日時でソートされます。

フォーマットが似ていると仮定すると

2012-09-02 17:17:36.891 This is line 1 in file 2   
...
2013-08-05 14:17:35.344 This is line 607082 in file 2
2013-08-05 14:17:36.891 This is line 607083 in file 2
...
2013-09-05 14:27:36.891 This is line 934594 in file 2

現在、これらのファイルを解析し、行をすばやく見つけようとするプログラムを作成しています。

たとえば、私が実行した場合

./my_program -start_time "2013-08-05 14:17:36" file_2.txt

このプログラムは、結果として 607083 を返すことができると期待しています。

また、-start_time は、「2013-08-05 14:17:35.899」や「2013-08-15」などの他の粒度に基づくこともできますが、最も近い結果を期待しています。

このファイルを 1 行ずつトラバースし、各行の先頭のタイムスタンプを比較できます (文字列比較を使用するだけです) が、O(N) 時間かかります。私はすでにそれを実装しており、スキップする行が最初に何百万行もあると本当に遅いことがわかりました。

これにバイナリ検索を使用できるかどうか疑問に思っています。最も近い結果を返す最良の方法であり、O(lgN) 時間しかかからないと思います

4

2 に答える 2

0

Unix/Posix で実行している場合は、ファイル全体を mmap() してメモリ上で操作できます (lseek() などは避けてください)。

したがって、「char *logbuffer = mmap(...)」ポインターを取得し、そこでバイナリ検索を実行できます。

于 2013-10-31T15:16:47.320 に答える
0

はい、できます。日付順のログです。最新および最後の日付である必要がある最初と最後の行を取得してみませんか。

日付を秒に変換する関数を作成できます。最初の呼び出しでログの途中に移動し、日付が大きいか小さいかなどを確認します... (バイナリ検索)

これが役に立ち、これがどのように機能するかについての私の説明が明確であることを願っています

于 2013-10-31T14:53:27.983 に答える