「updatedb」と「locate」はどのようなデータベースを使用しますか?


25

locateプログラムfindutilsスキャン1またはファイル名とディスプレイの以上のデータベースの任意のマッチ。find最後のファイル名データベースの更新中にファイルが存在した場合、これは非常に高速なコマンドとして使用できます。

現在、多くの種類のデータベースがありますが、

それで、どのようなデータベースがupdatedb更新され、locate使用しますか?

ありがとう。


Locateが実際にBerkelyDBを使用しているかどうかに関係なく、調査する価値があります。これは非常に古く、シンプルで効果的なディスクベースのキーと値のストアです。
pjc50

@ pjc50したいです。データベースのファイルはどこにありますか?それらのコンテンツをどのように表示しますか?
ティム


「ページが見つかりません」、リンクはserverfault.com/questions/454127/…である
ティム

それでは、データベースで「キー」と「値」は何を表していますか?Stephen Kittのコメントunix.stackexchange.com/questions/379725/…を正しく理解していれば、データベースはキーバリューではありません。
ティム

回答:


29

locate/の実装でupdatedbは、一般的なデータベースエンジンではなく、要件に合わせた特定のデータベースを使用します。これらの特定のデータベースは、実装ごとに文書化されています。例えば:

  • GNU findutils' はに文書化されておりlocatedb(5)、ファイルのリストにすぎません(特定の圧縮アルゴリズムを使用)。
  • mlocateはに記載されておりmlocate.db(5)、ディレクトリとファイルのリスト(メタデータ付き)と見なすこともできます。

ありがとう。特定の要件に合わせた特定のデータベースの設計と実装の原則をどこでどのように学習できますか?読書のための参考文献をいただければ幸いです。
ティム

11
デザインデータベースは、ので、それらについて学ぶ、データ構造の設計に帰着して、サイズ対速度の設計上のトレードオフについて...私のようなものかもしれない、いいでしょう、特定のリソースを知らない真珠のプログラミングが可能ですこれらのトピックについての考え方のいい紹介です(そして、それらについても考えすぎないでください)。
スティーブンキット

ありがとう。データ構造について何かを学びました。次の質問は、データ構造からデータベースへの参照と方法を見つけることです。
ティム

2
使用されるデータベースlocateはディスクに保存されたデータ構造にすぎないため、データ構造から対応するデータベースに移動するのは比較的簡単です。あなたの質問が示すようにデータベースに移行することはまったく別のことです。それらのトピックに特化した本やコースがあります。MongoDBやPostgreSQLなどのデータベース管理システムの設計と開発は、今日のコンピューターサイエンスやソフトウェアエンジニアリングにおける困難な問題の1つです。特に、分散型の側面を使用する場合はなおさらです。
スティーブンキット

2
私は長年にわたり、locatedbとmlocate.dbをかなり使いこなしてきました。私はもともとdlocate、debian で私のプログラムのためにlocatedbを生成するためのperlコードを持っていました。テキストファイルをgrepするだけで、locatedbを検索するよりも何倍も高速であり、最近のディスクサイズを考えると、ファイルサイズの節約は取るに足らないものであることがわかりました。だから私はただgrepに切り替えました。mlocate cronジョブの実行後にmlocate.dbをプレーンテキストにダンプするローカルcronジョブもあります。ローカルqlocateシェルスクリプトで検索しmlocateます。実行よりもはるかに高速で、便利な追加オプションもあります。
cas

13

Gnu LibCを使用して記述/読み取りされたC構造体のフラットファイルのようです OBSTACKS Macros

ソースを見る

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

似たようなものを得ることができます

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz

2
ありがとう。最後の2つのコマンドは何をしていますか?
ティム

2
@Tim Firstコマンドはfind、ルート(/)ディレクトリからファイルシステム()を検索します。ディレクトリ()ではなく-xdev、他のファイルシステム()、通常のファイル(-type f)のディレクトリに降りることはありません。出力を圧縮し()、ファイルに保存します()。次の行は、圧縮ファイル内のファイルを検索しています*.git-not -path \*\.git\/\*| gzip -9/tmp/files.gz> /tmp/files.gzzgrepfile_i_want/tmp/files.gz
-piotrekkr

2

私が知っている限りでは、キー/値デーモンレスデータベースであるBerkeley DBがあります。詳細については、リンクをたどってください。ウィキペディアからの抽出:

Berkeley DB(BDB)は、キー/値データ用の高性能な組み込みデータベースを提供することを目的としたソフトウェアライブラリです。Berkeley DBは、C ++、C#、Java、Perl、PHP、Python、Ruby、Smalltalk、Tcl、および他の多くのプログラミング言語のAPIバインディングを使用してCで記述されています。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()関数によって定義されます。


2
locate/ の実装に依存しupdatedbます。
Stephen Kitt

2
mlocateほとんどの場合、Berkeley DBは使用しません。
スティーブンキット

1
BerkeleyDBの主張を裏付ける情報源はありますか?答えの2番目の部分は矛盾しています。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.