ソートされたテキストファイルでのバイナリ検索


13

数十億行の可変長の大きなソート済みファイルがあります。新しい行があれば、ソートされたファイルに含まれていた場合に取得するバイト番号を知りたいと思います。

a\n
c\n
d\n
f\n
g\n

入力 'foo'が与えられると、出力9が得られます。

これは、ファイル全体を単純に調べることで簡単に実行できますが、数十億行の可変長であるため、バイナリ検索を行う方が高速です。

そのようなテキスト処理ツールはすでに存在しますか?

編集:

今では:https : //gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch


検索する行の長さ(文字数)は?また、そのような行をいくつ検索する必要がありますか?
gogoud

@gogoud限られたツールを探しているのではなく、任意のテキストファイルで機能するツールを探しています(行の長さや行数に関係なく)。
オレ丹下

そのような巨大な入力を生成したい人のために:unix.stackexchange.com/a/279098/9689
Grzegorz Wierzowiecki

回答:


4

私はこれを行ういくつかの標準ツールを知りません。ただし、独自に作成することもできます。たとえば、次のrubyスクリプトが仕事をするはずです。

file, key = ARGV.shift, ARGV.shift
min, max = 0, File.size(file)

File.open(file) do |f|
  while max-min>1 do
    middle = (max+min)/2
    f.seek middle
    f.readline
    if f.eof? or f.readline>=key
      max = middle
    else
      min = middle
    end
  end
  f.seek max
  f.readline
  p f.pos+1
end

シーク後、通常は行の途中にあるため、次の行の先頭に到達するために1つの読み取り行を実行する必要があり、キーを読み取って比較できます。


sort -rおよびでソートされたファイルを処理する-n / -rを受け入れるように変更できますsort -nか?
オレ丹下

上記のコードは、主にアイデアを示すためのものです。完璧にはほど遠い。(たとえば、キーが最初の場所に移動すると失敗します。)必要に応じて自由に適応してください。
michas

5

(これはあなたの質問に対する正しい答えではなく、単なる出発点です。)

同様の状況でsgrep(ソートされたgrep)を使用しました

残念ながら(現在の状態が必要です)バイトオフセット出力はありません。しかし、簡単に追加できると思います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.