なぜ `updatedb`プログラムはそんなに速く動くのですか?


22

通常、フルディスクスキャンを実行し、システム内のすべてのファイルを処理するプログラムがある場合、実行に非常に長い時間がかかります。なぜupdatedbは比較して非常に高速に動作するのですか?

回答:


22

答えはのバージョンに依存しますlocate使用して、それはだ公平な機会があるとしているあなたmlocate、そのupdatedb実行素早くフルディスクスキャンをやって回避することによって:

mlocateは、locate / updatedbの実装です。「m」は「マージ」の略です。updatedbは既存のデータベースを再利用して、ほとんどのファイルシステムの再読み取りを回避します。これにより、updatedbが高速になり、システムキャッシュが無駄になりません。

(データベースは、各ディレクトリのタイムスタンプ、ctimeまたはのmtimeいずれか新しい方を保存します。)

のほとんどの実装と同様にupdatedb、は、mlocate無視するように設定されているファイルシステムとパスもスキップします。デフォルトでは、そこに何もしないmlocateの場合、しかし、分布は一般的に、基本的な提供updatedb.confなど、ネットワークファイルシステム、仮想ファイルシステムを無視している(参照Debianの設定ファイル例を、GNUのはので、これは、Debianに標準的な方法ですupdatedbされて同様に構成されました)。


かなり良い質問と回答で、「差分」スキャンがあることすら知りませんでした。
ルイFリベイロ

1
ありがとう!ファイルを変更すると、そのすべての親ディレクトリのctimeとmtimeも変更されることに気づきませんでした。
hugomg

4
@hugomg私は実際にはそうは思わない。mtime直接の親のみを変更する必要があります。
クサラナンダ

だから私はそれを正しく理解すれば、mlocate気にctimeしてmtimeそれが唯一のディレクトリエントリのリストはまだそれが実際のファイルについて自分自身を気にしない手段同じ(無削除または追加されたファイル)、であるかどうかを気に暗示しています。あれは正しいですか ?
セルギー・コロディアズニー

@セルギー:もちろん。 locateではありませんgrep -R。ファイルの内容は読み取りません。
ケビン

9

変更時間のチェックに加えてmlocate、/etc/ updatedb.confで指定されている(およびman updatedb.confで説明されている)多数の興味のないファイルや潜在的に重複するファイルがあるファイルシステムの特定のサブツリーも無視します。

  • バインドマウント
  • いくつかの種類のファイルシステム(9p、afs、bdevなど)
  • VCSリポジトリデータベース(.git、.hgなど)
  • いくつかのハードコードされたディレクトリ(/ media、/ tmp、/ var / spool / cupsなど)。

ただし、これはデフォルトではそうではないため、基本動作は使用されているディストリビューションによって異なります。(他のupdatedb実装も構成された除外をサポートします。)
スティーブンキット

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