locate
のfindutils
プログラムは、ファイル名の1つ以上のデータベースをスキャンし、一致するものを表示します。最後のファイル名データベースの更新中にファイルが存在した場合、これは非常に高速なfind
コマンドとして使用できます。
今日では多くの種類のデータベースがあり、
ドキュメント指向データベース (例:MongoDB)
Key-Valueデータベース (例:Redis)
列指向のデータベース (例:Cassandra)
では、updatedb
はどのようなデータベースを更新し、locate
を使用しますか?
ありがとう。
locate
/updatedb
の実装では、一般的に、一般的なデータベースエンジンではなく、要件に合わせて調整された特定のデータベースを使用します。これらの特定のデータベースは、各実装ごとに文書化されています。例えば:
findutils
’は locatedb(5)
に記載されており、ファイルのリストにすぎません(特定の圧縮アルゴリズムを使用)。mlocate
は mlocate.db(5)
に記載されており、ディレクトリとファイル(メタデータ付き)のリストと見なすこともできます。C構造体のフラットファイルのようで、Gnu LibCを使用して書き込み/読み取り OBSTACKSマクロ
ソースを見る
https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L72
https://github.com/msekletar/mlocate/blob/master/src/locate.c#L41
あなたはと同じようなものを得ることができます
find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
私が知っている限りでは Berkeley DB これはキー/値のデーモンレスデータベースです。詳細については、リンクをクリックしてください。ウィキペディアからの抜粋:
Berkeley DB(BDB)は、キー/値データ用の高性能組み込みデータベースを提供することを目的としたソフトウェアライブラリです。 Berkeley DBはCで記述されており、C++、C#、Java、Perl、PHP、Python、Ruby、Smalltalk、Tcl、およびその他の多くのプログラミング言語用のAPIバインディングがあります。 BDBは、任意のキーとデータのペアをバイト配列として格納し、1つのキーに対して複数のデータアイテムをサポートします。 Berkeley DBはリレーショナルデータベースではありません。
RHEL/CentOSでのデータベースの場所は/var/lib/mlocate/mlocate.db
(他のディストリビューションについては不明)。コマンド locate --statistics
はデータベースの場所といくつかの統計についての情報を提供します(例):
Database /var/lib/mlocate/mlocate.db:
16,375 directories
242,457 files
11,280,301 bytes in file names
4,526,116 bytes used to store database
Mlocate形式の場合、ここにmanページの先頭があります。
Mlocateデータベースはファイルヘッダーで始まります。マジックナンバー(Cリテラルのような「\ 0mlocate」)は8バイト、ビッグエンディアンの構成ブロックサイズは4バイト、ファイルフォーマットバージョン(0)は1バイト、1 「可視性が必要」フラグのバイト(0または1)、2バイトのパディング、およびデータベースのルートのNUL終了パス名。
ヘッダーの後に構成ブロックが続きます。これは、構成の変更が内容に影響を与える可能性がある場合にデータベースが再利用されないようにするために含まれています。バイト単位の構成ブロックのサイズは、ファイルヘッダーに格納されます。構成ブロックは、変数名で並べられた一連の変数割り当てです。各変数の割り当ては、NULで終了する変数名とNULで終了する値の順序付きリストで構成されます。値リストは、もう1つのNUL文字で終了します。使用される順序は、strcmp()関数によって定義されます。