Updatedb nasıl bulmak çok daha hızlı?


11

Ne updatedbkadar hızlı find?

Görünüşe benzer bir görev yapan updatedbbir findkomut ile zamanlanmış bir karşılaştırma .

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 dosyam:

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 komutu için ben sadece ext4dosya sistemi belirledim çünkü bu tek dosya sistemi updatedbbakmak gerekir. Ben dosya uzantıları ile uğraşmadı ve nasıl bir bağlama bağlama dışarıda bilmiyorum findama ben yok. Ayrıca '/ proc' için bir dışlama ekledim updatedb. Ben de '/ sys' yoksaymalıydım.

Herhangi bir fark varsa, kurallar biraz daha basit olduğundan ve diske yazmak zorunda olmadığından find komutunun biraz daha hızlı olmasını beklerdim. Bunun yerine updatedbçok daha hızlı.

$ ./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

Ne farklı yapıyorlar?


set -xkomutları yürütülmeden önce yazdırmayı açmak için kullanın , bu nedenle eval maskaralıklarına ihtiyacınız yoktur.
Peter Cordes

Yanıtlar:


15

İçin man sayfasına bakın updatedb"veritabanı zaten varsa, veri değişmemiştir yeniden okuma dizinleri önlemek için yeniden kullanılır".

Oysa findkomut, değiştirilip değiştirilmediklerine bakılmaksızın tüm dizinleri dolaşır.


1
Böyle bir şeyi kontrol etmek nasıl mümkün: stackoverflow.com/questions/3620684/…
Praxeolitic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.