非常に大きなテキストファイル(10GBの場合もあります)でバイナリ検索を実行するために使用できるライブラリはありますか?
このファイルは一種のログファイルです。すべての行は日付と時刻で始まります。したがって、行は順序付けられます。
非常に大きなテキストファイル(10GBの場合もあります)でバイナリ検索を実行するために使用できるライブラリはありますか?
このファイルは一種のログファイルです。すべての行は日付と時刻で始まります。したがって、行は順序付けられます。
行の長さが同じであるとは限らないため、キャリッジ リターンやライン フィードなどの認識可能な行区切り記号が必要になります。
二分探索パターンは、ほとんど従来のアルゴリズムになります。ファイルの「中間」を (長さで) シークし、たまたま着地した行の先頭まで (バイトごとに) シークし、行区切りシーケンスで識別され、そのレコードを読み取り、比較を行います。比較に応じて、上または下 (バイト単位) の途中までシークし、繰り返します。
レコードの開始インデックスを特定するときは、最後のシークと同じかどうかを確認してください。目的のレコードにダイヤルインするときに、途中で移動しても別のレコードに移動しないことに気付く場合があります。たとえば、それぞれ 100 バイトと 50 バイトのレコードが隣接しているため、75 バイトでジャンプすると常に最初のレコードの先頭に戻ります。その場合は、比較を行う前に次のレコードを読んでください。
かなり早く目標に到達できることがわかるはずです。
私はそれを行う方法について疑似コードを書き始めましたが、見下すように見えるかもしれないのであきらめました。二分探索の書き方はおそらく知っているでしょう。実際には複雑ではありません。
次の 2 つの理由から、図書館にはありません。
要約すると、あなたの必要性はあまりにも具体的で単純すぎて、誰かがライブラリを書くのに苦労するカスタムコードに実装できないと思います:)
ファイルをストリーミングできる必要がありますが、ランダムアクセスも必要になります。ファイルの各行に同じバイト数が含まれているという保証がないため、これをどのように達成するかはわかりません。それがあれば、オブジェクトのStreamを取得し、Seekメソッドを使用してファイル内を移動し、そこから1行を構成するバイト数を読み取ることでバイナリ検索を実行できます。ただし、これも、行が同じバイト数の場合にのみ有効です。そうしないと、行の途中に飛び込んだり飛び出したりします。
何かのようなもの
byte[] buffer = new byte[lineLength];
stream.Seek(lineLength * searchPosition, SeekOrigin.Begin);
stream.Read(buffer, 0, lineLength);
string line = Encoding.Default.GetString(buffer);
これは、ファイル内の改行ごとに Int64 をメモリに保持するという制約の下では、それほど悪くはありません。これは、1 行あたり 1000 バイト (10,000,000,000 / 1000 * 4) = 40mb を見ているとすると、テキスト行の平均の長さに大きく依存します。非常に大きいですが、可能です。
だからこれを試してください:
Listオブジェクトには、バイナリ検索メソッドがあります。
http://msdn.microsoft.com/en-us/library/w4e7fxsh%28VS.80%29.aspx