3

ファイルに 100 万行ある場合、1 行ずつ繰り返す (シーケンシャル アクセス) ことなく、50000 行目に直接ジャンプすることはできません。これは、Googleでいくつかの調査を行った後の私の理解です。

この場合、数秒で行を検索する1TBのデータを持つデータベースはどうですか。1 日の終わりに、DB は独自のメタデータを含むフォーマットされたファイルにも保存されます。

100 万行のレコードのファイルで、このような高速な文字列検索を実装できるでしょうか。このような大規模なデータを処理するには、どのような実装が役立つのでしょうか...

注 各行の長さは 10 から 100 まで変化する場合があります。

Javaで可能ですか?

4

5 に答える 5

8

行がどこにあるかのインデックスを維持する必要があります。このJava Chronicleを実行するライブラリがあります。行にインデックスが付けられると (書き込み時に作成されます)、わずか 100 ns でランダムにアクセスできます。

同じファイル内の TB のデータ、または比較的少数のファイルを処理するように設計されています。何千ものファイルがある場合は、ファイルごとのオーバーヘッドが大きくなるため、別のアプローチを使用する必要があります。

于 2012-10-21T10:18:00.657 に答える
2

ファイル構造を二分探索に適合させることができます。各行は一意のマーカー (行自体では使用されないバイト シーケンス) で始まり、その後に行番号が続きます。ラインを探して、

  1. ランダムな場所にジャンプします。
  2. マーカーまで読み上げます。
  3. 行番号を読み取ります。
  4. それが探しているものである場合は、完了です。それ以外の場合は、ジャンプする別のランダムな位置を選択します (見つけた行番号に基づいて、現在の位置よりも大きいまたは小さい)。

ラインについて想定できることが多ければ多いほど、ジャンプのランダム性は低くなります。たとえば、ラインの長さの平均から位置を推定できます。推測を改善するために、いくつかの行の場所のキャッシュを持つこともできます。

于 2012-10-21T11:11:12.807 に答える
2

1- すべての行を 1 回だけ読み取り
ます。 2- lineNumber (キーとして) と startingPostionOfLine を Map オブジェクトに入れます。

次に、

startingPostionOfLine= map.get(lineNumber) を取得できます。
startingPosition を見つけたら、RandomAccessFile.seek(startingPosition) メソッドでジャンプします。

于 2012-10-21T10:29:09.773 に答える
1

行ごとに反復せずに50000行目に直接ジャンプすることはできません

ランダムアクセスファイルを見てください

于 2012-10-21T10:17:31.657 に答える
1

各行の長さがわかっている場合は、RandomAccessFileを使用してから、必要な行までskipBytesを使用できます。

于 2012-10-21T10:18:05.467 に答える