通常、 でファイルを検索するとgrep
、検索は順番に行われます。非順次検索または並列検索を実行できますか? または、たとえば、最初の行を通過することなく、行l1
と行の間を検索しますか?l2
l1-1
3 に答える
を使用して、特定の行オフセットで atail -n +N file | grep
を開始できます。grep
と組み合わせhead
てtail
、固定範囲のみを検索できます。
ただし、これは依然としてファイルの行末文字をスキャンする必要があります。
一般に、シーケンシャル読み取りは、ディスクの読み取りが最も高速です。並列検索を実行しようとすると、ランダムなディスク シークが発生し、パフォーマンスが低下する可能性があります。
価値のあるものとして、典型的な本には1ページあたり約200語が含まれています. 典型的な 1 単語あたり 5 文字の場合、1 ページあたり約 1 KB を見ているので、1000 ページでも 1 MB になります。標準的なデスクトップのハード ドライブは、ほんの一瞬で簡単に読み取ることができます。
この方法では、ディスクの読み取りスループットを高速化することはできません。実際、それほど小さなファイルでディスクの読み取り速度が飽和状態にならないことはほぼ保証できます。確認に使えますiostat
。
C
ファイルが完全に ASCII である場合は、ロケールをロケールに設定して、あらゆるタイプの Unicode 変換を回避することで処理を高速化できる場合があります。
同じファイルに対して複数の検索を実行する必要がある場合は、逆索引を作成して検索を実行することをお勧めします。コードについては、それを行うことができる熱狂的な ctags のようなツールがあります。それ以外の場合は、おそらくカスタム ツールの作成を検討しているでしょう。大規模なコーパスに対して一般的なテキスト検索を行うためのツールがありますが、それはおそらくやり過ぎです。全文検索をサポートする Postgresql などのデータベースにファイルをロードして、インデックスを作成することもできます。
行を固定レコード長にパディングしても、必ずしも問題が解決するとは限りません。前に述べたように、IO 全体の問題はないと思います。作成した一時的な RAM ディスクにファイルを移動するだけで問題を確認できます。これにより、潜在的なすべての IO が削除されます。それでもまだ十分に速くない場合は、まったく別のソリューションを追求する必要があります。
行が固定長の場合dd
、ファイルの特定のセクションを読み取るために使用できます。
dd if=myfile.txt bs=<line_leght> count=<lines_to_read> skip=<start_line> | other_commands
dd
は、入力 (bs) に指定されたブロック サイズを使用してディスクから読み取ることに注意してください。これは遅くなる可能性があり、ディスクから少なくとも 4kb をプルするように行のグループを一度に読み取ることにより、バッチ処理することができます。この場合、ブロックサイズの倍数ではない行で開始および終了できるようにフラグをskip_bytes
確認する必要があります。count_bytes
もう 1 つの興味深いオプションは、出力ブロック サイズobs
です。これは、入力と同じか、1 行にすることでメリットが得られます。
簡単な答えは、できません。ファイル全体をスキャンするのではなく、各行がどこで終了するかを知りたいのです。実際にファイルをスキャンしないと、各行がどこで終わるかを知ることはできません。QED ;)