質問
私は複数のログファイルのイベント(イベント当たります。のログにはまる可能性がある部分が重なっているのです。のログが発行する別のクライアントマシンらが複数のタイムゾーンが思いの時間帯).各イベントはタイムスタンプが正常化への共通の時間(instantianting各ログ-パカレンダーインスタンスのタイムゾーンのログファイルを用いてgetTimeInMillisのUTC時間)のログにてソートされる時刻です。複数のイベントが発生と同時に、それと同等のイベント。
これらのファイルできる比較的規模が大きい、500000イベントは、シングルで読む全体のログの内容を簡単なイベント[]ことは不可能です。
私のような統合のイベントからそれぞれのログを単一のログです。しっぽのようにmergesortタスクが、それぞれのログはすでにソートされ、必要なされていったといわれている。第二の成分は同じイベントまたは別のログファイルにしたい削除"を重複したイベント"ファイルに出力のログです。
で実現できる"場"として、順次作業が小さいバッファーのログファイルとは何ですか?私は簡単な読みのすべてのファイルをイベント[],の並べ替えリストを削除します重複であるが、これまでのところ、私のプログラムの機能だけを見ることが求められていたのです。あり洗練されたアプローチが利用できないことなどを読んでイベントからそれぞれのログを同時に?
解決
を読む最初の行からそれぞれのログファイル
ループ
a.に"最も早いします。
b.挿入は、"早い"シチュエーションがクロスオーバのログファイル
c.の次の行からのファイルが含まれているだけ早期ライン
きのチェックを複製とbとcを進めポインタのファイルです。
他のヒント
必ずオープン毎にログファイルです。読み込む最初の行の各配列に'現在'ます。その繰り返し送迎は行っており、最も低いタイムスタンプの現在の配列になります。書き出力に読み込むための新ラインから適切なソースファイルに交換してください。
この例はPythonでは、そ擬似コードがありま
def merge_files(files, key_func):
# Populate the current array with the first line from each file
current = [file.readline() for file in files]
while len(current) > 0:
# Find and return the row with the lowest key according to key_func
min_idx = min(range(len(files)), key=lambda x: return key_func(current[x]))
yield current[min_idx]
new_line = files[min_idx].readline()
if not new_line:
# EOF, remove this file from consideration
del current[min_idx]
del files[min_idx]
else:
current[min_idx] = new_line
このレジリンク: http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194
使用ヒープに基づく配列)の要素の数がこのヒープレーするような感じでという疑問を表すログファイルです。
読みの記録からすべてのファイルを挿入してもらうheap.
ループまで(記録のファイル)
> remove the max element from the heap > write it to the output > read the next record from the file to which the (previous) max element belonged if there are no more records in that file remove it from file list continue > if it's not the same as the (previous) max element, add it to the heap
しかし、これら全てのイベントの一つのログファイルは、ソートが重複している。に複雑なアルゴリズムは(n log k)nの計数記録およびkはログファイルです。
のものを使用できるバッファリーダーやファッwriterオブジェが、ファイルからの回数を最小限に抑えるためにディスクを読み込みおよび書き込みのための最適化のための時間。
ための統合時系列の複数のログファイルを複数回線あたりのエントリのログ(javaアプリケーションのシームレスなくそのスタックトレースは同一です)。その実施のための簡易シェル+perlスクリプトこの当社事ができます。ご興味のある方が手のリンク http://code.google.com/p/logmerge/
読み取りのみ行時の両方からのソースファイルです。を比較し、ラインや書きの一つの出力ファイルを進めます。これまでのファイルの場合、ファイルです。
必ず削除複:)
このマネージC#コードで記述が明らのアプローチ:
StringReader fileStream1;
StringReader fileStream2;
Event eventCursorFile1 = Event.Parse(fileStream1.ReadLine());
Event eventCursorFile2 = Event.Parse(fileStream2.ReadLine());
while !(fileStream1.EOF && fileStream2.EOF)
{
if (eventCursorFile1.TimeStamp < eventCursorFile2.TimeStamp)
{
WriteToMasterFile(eventCursorFile1);
eventCursorFile1 = Event.Parse(fileStream1.ReadLine());
}
else if (eventCursorFile1.TimeStamp == eventCursorFile2.TimeStamp)
{
WriteToMasterFile(eventCursorFile1);
eventCursorFile1 = Event.Parse(fileStream1.ReadLine());
eventCursorFile2 = Event.Parse(fileStream2.ReadLine());
}
else
{
WriteToMasterFile(eventCursorFile1);
eventCursorFile2 = Event.Parse(fileStream2.ReadLine());
}
}
の状態になってことだパ'dirty、そのような..
また貸出のログの合併に明らかにAwstatsがオープンソースのサイトの統計ツールです。
logresolvemerge.pl はperlスクリプトとの合併に複数のログファイル:も利用できます複数のスレッドにマネジメントのログファイルが必要perl5.8のためのマルチスレッド利用)となります。てみましょうを使用し可能ツールの代わりにビル。