अपडेट कैसे खोजे जाने की तुलना में बहुत तेज है?


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"

खोज कमांड के लिए मैंने केवल ext4फाइल सिस्टम को निर्दिष्ट किया है क्योंकि यह एकमात्र फाइल सिस्टम है जिसे updatedbअंत तक देखना चाहिए। मैं फ़ाइल एक्सटेंशन से परेशान नहीं था और मैं नहीं जानता कि कैसे एक बाँध माउंट को बाहर findकरना है लेकिन मेरे पास कोई नहीं है। मैंने '/ proc' के लिए एक बहिष्करण भी जोड़ा, जो ऐसा लगता है कि updatedbउपेक्षा करता है। मुझे '/ sys' को भी नजरअंदाज करना चाहिए था।

अगर कोई अंतर होगा तो मुझे लगता है कि यह थोड़ी आसान होने के बाद से कमांड को थोड़ा और तेज होने की उम्मीद होगी और इसे डिस्क पर लिखना नहीं होगा। इसके बजाय 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 की आवश्यकता न हो।
पीटर कॉर्डेस

जवाबों:


15

के लिए मैन पेज देखें updatedb, "यदि डेटाबेस पहले से मौजूद है, तो इसका डेटा पुन: उपयोग करने वाली निर्देशिकाओं से बचने के लिए पुन: उपयोग किया जाता है जो बदल नहीं गए हैं"।

जबकि findकमांड सभी निर्देशिकाओं की परवाह किए बिना कि क्या वे बदल गए हैं।


1
ऐसी चीज़ की जाँच करना कैसे संभव है: stackoverflow.com/questions/3620684/…
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.