1

指定された時間枠内で発生した KEY_STRING を検出するために、サードパーティ アプリケーションから適切なサイズのログ ファイル (最大 50Mb、その時点でラップ) を解析しています。このログ ファイルの典型的なエントリは次のようになります。

DEBUG 2013-10-11@14:23:49 [PID] - Product.Version.Module
(Param 1=blahblah Param2=blahblah Param3 =blahblah
Method=funtionname)
String that we usually don't care about but may be KEY_STRING  

エントリは空白行で区切られます (エントリの最後に \r\n、次のエントリの開始前に \r\n)

これは Windows 固有の実装用であるため、移植可能である必要はなく、C/C++/Win32 にすることができます。

この行を 1 行ずつ読み取るのは時間がかかりますが、タイムスタンプを解析してエントリが指定された時間枠内にあるかどうかを確認してから、エントリに KEY_STRING が存在するかどうかを確認できるという利点があります。チャンクごとにファイルを読み取ると、KEY_STRING が見つかることがありますが、チャンクに以前のタイムスタンプがないか、チャンクの境界が KEY_STRING の途中にある可能性さえあります。ファイル全体をメモリに読み込んで解析することはオプションではありません。現在、これが含まれるアプリケーションのフットプリントは比較的小さいため、ファイルを解析するためだけにこれを最大 10 倍に増やすことは正当化できません (一時的であっても)。 . 区切られたチャンク (具体的には "\r\n\r\n") でファイルを読み取る方法はありますか? または、私が考えていなかった別の/より良い方法はありますか?

これに関するヘルプは大歓迎です!

4

3 に答える 3

0

考えられる解決策の 1 つは、メモリ マップト ファイルを使用することです。私は個人的におもちゃのアプリケーション以外にそれらを使用したことはありませんが、その背後にある理論のいくつかは知っています.

基本的に、それらはメモリであるかのようにファイルの内容にアクセスする方法を提供します。仮想メモリと同様の方法で動作すると私は信じているため、必要な部分は必要に応じてページインされ、ある時点でページアウトされます (ドキュメントを読んで、この背後にある規則を理解してください)。

擬似コードでは (私たちは皆擬似コードが好きなので)、次の行に沿って何かを行います。

HANDLE file = CreateFile(...);
HANDLE file_map = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, ...);
LPVOID mem = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);

// at this point you can use mem to access data in the mapped part of the file...
// for your code, you would perform parsing as if you'd read the file into RAM.

// when you're done, unmap and close the file:
UnmapViewOfFile(mem);
CloseHandle(file_map);
CloseHandle(file);

最も優れたアドバイスを提供していないことをお詫びしますが、代わりにさらに読むことをお勧めします.Windowsはメモリを処理するための多くの機能を提供しており、一読の価値があります.

于 2013-10-14T16:11:21.597 に答える