grepは検索を高速化するためにキャッシュを使用しますか?


36

grep同じクエリ(および同じファイルでの異なるクエリ)での後続の実行は、最初の実行よりもはるかに高速であることに気付きました(大きなファイルを検索する場合、効果は簡単にわかります)。

これは、grepが検索に使用される構造の何らかのキャッシュを使用することを示唆していますが、インターネット上で参照を見つけることができませんでした。

grep後続の検索で結果をより速く返すことができるメカニズムは何ですか?

回答:


60

grep自体ではありませんが、ファイルシステム自体は最近読み取ったデータをキャッシュすることが多く、grepはディスクではなくメモリを効率的に検索するため、後の実行が高速になります。


2
私は同意します。初めてファイルをgrepすると、ファイルシステムのコードはファイルをディスクからキャッシュにロードします。その後すぐにgrepを再度実行すると、キャッシュから期限切れになる時間がありません。ファイルシステムキャッシュを手動でフラッシュする方法があるかどうかを確認し、時間の前後を比較します。
シャドゥール

3
@Shadur —方法があります。unix.stackexchange.com/questions/8398/を
mattdm

3
実用的な違いはありませんが、ファイルシステムではなくカーネルキャッシュです。
-pboin

@pboinわかりました、私は小さなショートカットを取りました。もちろん、それはそれ自体で(ディスク上の)ファイルシステムではなく、キャッシングを行うファイルシステムを処理するカーネルの一部です。知識はあるが真実。:)
ポールレイン

19

Linuxおよび* NIXシステムは、ファイルシステム(VFSで抽象化)とユーザーレベルプロセスの間にあるさまざまなキャッシュを使用します。したがって、grepではなく、キャッシュを実行するファイルシステムではなく、オペレーティングシステムです。

grepのパフォーマンスを担当するキャッシュはVFSバッファーキャッシュです。他のキャッシュはiノードとディレクトリ用ですが、ここでは使用しません。

詳細については、Linux Documentation Project:9.2 The Virtual File System http://tldp.org/LDP/tlk/fs/filesystem.htmlを参照してください。


5
再帰的なgrepを実行している場合、inodeキャッシュとdentryキャッシュは顕著な違いをもたらします。テストでは/usr/include、すべてのキャッシュがドロップされた状態で、システム上でgrep が16.4秒かかりました。すべてをキャッシュして、約0.3秒。ページキャッシュ(バッファキャッシュを保持している)のみをドロップすると、約14.3秒かかります。ページキャッシュを離れてdentry / inodeキャッシュをドロップすると、約12秒かかります。
mattdm

@mattdm、それは面白いです。どのようにキャッシュをドロップしましたか?
-JRW


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