updatebは、見つけるよりもはるかに高速ですか?


11

どのupdatedbようにはるかに高速findですか?

updatedbfind、一見似たようなタスクを実行するコマンドの時間を比較します。

compare.sh

#!/usr/bin/env bash

cmd="sudo updatedb"
echo $cmd
time eval $cmd

cmd="sudo find / \
    -fstype ext4 \
    -not \( \
        -path '/afs/*' -o \
        -path '/net/*' -o \
        -path '/sfs/*' -o \
        -path '/tmp/*' -o \
        -path '/udev/*' -o \
        -path '/var/cache/*' -o \
        -path '/var/lib/pacman/local/*' -o \
        -path '/var/lock/*' -o \
        -path '/var/run/*' -o \
        -path '/var/spool/*' -o \
        -path '/var/tmp/*' -o \
        -path '/proc/*' \
    \) &>/dev/null"

echo $cmd
time eval $cmd

私の/etc/updatedb.conf:

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset cramfs debugfs devpts devtmpfs ecryptfs exofs ftpfs fuse fuse.encfs fuse.sshfs fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs shfs smbfs sockfs sshfs sysfs tmpfs ubifs udf usbfs vboxsf"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /net /sfs /tmp /udev /var/cache /var/lib/pacman/local /var/lock /var/run /var/spool /var/tmp"

findコマンドの場合、ext4ファイルシステムを指定するだけupdatedbです。これは、ファイルシステムだけが最終的に調べなければならないためです。私はファイル拡張子を気にしませんでしたし、バインドマウントを除外する方法がわかりfindませんが、ありません。updatedb無視しているように見える「/ proc」の除外も追加しました。「/ sys」も無視するべきでした。

ルールが少しシンプルで、ディスクに書き込む必要がないため、違いがある場合、findコマンドは少し速くなると思います。代わりupdatedbにはるかに高速です。

$ ./compare.sh
sudo updatedb

real    0m0.876s
user    0m0.443s
sys 0m0.273s

sudo find / -fstype ext4 -not \( -path '/afs/*' -o -path '/net/*' -o -path '/sfs/*' -o -path '/tmp/*' -o -path '/udev/*' -o -path '/var/cache/*' -o -path '/var/lib/pacman/local/*' -o -path '/var/lock/*' -o -path '/var/run/*' -o -path '/var/spool/*' -o -path '/var/tmp/*' -o -path '/proc/*' \) &>/dev/null

real    6m23.499s
user    0m14.527s
sys 0m10.993s

彼らはどのように違うのですか?


set -xコマンドが実行される前にコマンドの印刷をオンにするために使用するため、eval shenanigansは必要ありません。
Peter Cordes、2015

回答:


15

のマニュアルページを参照してくださいupdatedb。「データベースがすでに存在する場合、変更されていないディレクトリの再読み取りを回避するために、データベースのデータが再利用されます」。

一方、findコマンドは、変更されたかどうかに関係なく、すべてのディレクトリを走査します。


1
そのようなことを確認する方法:stackoverflow.com/questions/3620684/…–
Praxeolitic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.