มีการอัปเดตอย่างไรเร็วกว่าการค้นหามาก


11

เป็นวิธีการupdatedbเพื่อให้ได้เร็วกว่าfind?

นี่คือการเปรียบเทียบเวลาระหว่างupdatedbและfindคำสั่งที่ทำงานคล้ายกัน

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แต่ฉันไม่มี ฉันยังเพิ่มการยกเว้นสำหรับ '/ proc' ซึ่งดูเหมือนว่าupdatedbจะไม่สนใจ ฉันควรละเว้น '/ 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เพื่อเปิดการพิมพ์คำสั่งก่อนที่พวกเขาจะดำเนินการดังนั้นคุณไม่จำเป็นต้อง shenanigans eval
ปีเตอร์กอร์เดส

คำตอบ:


15

ดู man page สำหรับupdatedb"หากฐานข้อมูลมีอยู่แล้วข้อมูลจะถูกนำมาใช้ซ้ำเพื่อหลีกเลี่ยงการอ่านซ้ำไดเรกทอรีที่ไม่มีการเปลี่ยนแปลง"

ในขณะที่findคำสั่งสำรวจเส้นทางไดเรกทอรีทั้งหมดโดยไม่คำนึงว่าพวกเขามีการเปลี่ยนแปลง


1
เป็นไปได้อย่างไรที่จะตรวจสอบสิ่งต่าง ๆ เช่น: stackoverflow.com/questions/3620684/…
Praxeolitic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.