私のファイルには数百万行があり、メモリに常駐し、/dev/shm/tmp.file
複数のスレッドからアクセスされます。
831092,25a1bd66f2eec71aa2f0a8bb3d,/path/to/a/file
4324,8d83c29e4d8c71bd66f1bd66fs,/path/to/another/file
...
,
そして、2番目の部分の後の部分に基づいてソートしますsort -t , -k3
。通常、各行は外観を持ち、[0-9]*,[0-9a-z]*,.*
ファイルパスには、またはを\0
除くすべての文字を含めることができます\n
。
追加のコピーを作成せずに、できるだけ早く特定のディレクトリにあるすべてのファイルの行を抽出する必要があります。ファイルがこのようにソートされているので、私が探している行はファイルの途切れない塊です。
私は現在使用していますが、grep -F ',<directory>' /dev/shm/tmp.file
最初のヒットでバイナリ検索を実行してからブロックを1行ずつ拡張したり、新しい行ごとにファイル全体を読み取ったりすることなく、別のバイナリ検索を使用する方がはるかに高速です。しかし、これはbashスクリプトに統合する必要があり、bashでlseekのようなことをする方法を見つけることができませんでした。
持つスグレフただし、行全体を並べ替える必要があります。
',<directory>'
すばやくすべての一致を抽出するにはどうすればよいですかgrep -F
?
編集する:入力は/dev/shm/tmp.file
この抽出を実行するためにのみ使用されます。したがって、作業を容易にするために何らかの方法で前処理することはオプションです。
編集する: a.b
a
a/b
すべてのサブディレクトリをブロック内に含める必要があるため、間の順序は問題ではありません。
答え1
831092,25a1bd66f2eec71aa2f0a8bb3d,/path/to/a/file
次に変更すると/path/to/a/file,831092,25a1bd66f2eec71aa2f0a8bb3d
次のことができます。
look /path/to/ /dev/shm/tmp.file
look
POSIXでは指定されていませんが、非常に一般的な1970年代の伝統的なUnixユーティリティです。 Debianとその派生ではパッケージにありbsdmainutils
、util-linuxでも1つを見つけることができます(同じ名前のDebianパッケージではなくBSDからもコピーしました)。
look
mmap()
■ファイルを検索し、バイナリ検索を実行します。
grep
しかし、そのオプションを渡さない限り、Debian の実装はデフォルトの線形検索に戻ります-b
(ため息).したがって、Debian または派生製品では、次のものが必要です。
look -b /path/to/ /dev/shm/tmp.file
また、一部の実装では、処理できるファイルサイズに制限があります(Debianに対応するバグとパッチを見る)