अशुद्ध पेस: "तेज" विधि जिसका मैं नीचे उल्लेख करता हूं, वह धीमी गति से 60 गुना तेज नहीं है। यह 30 गुना तेज है। मैं घंटे पर गलती को दोष दूँगा (3AM स्पष्ट सोच के लिए दिन का मेरा सबसे अच्छा समय नहीं है :) ।।
अद्यतन: मैंने परीक्षण समय का सारांश (नीचे) जोड़ा है।
गति कारक से जुड़े दो मुद्दे प्रतीत होते हैं:
- उपयोग की गई कमांड का विकल्प (नीचे दिखाया गया समय तुलना)
- एक निर्देशिका में बड़ी संख्या में फ़ाइलों की प्रकृति ... ऐसा लगता है कि "बड़ा बुरा है"। संख्या बढ़ने के साथ चीजें बहुत धीमी हो जाती हैं।
सभी परीक्षण 1 मिलियन फाइलों के साथ किए गए हैं।
(वास्तविक, उपयोगकर्ता और sys बार परीक्षण स्क्रिप्ट में हैं)
परीक्षण स्क्रिप्ट paste.ubuntu.com पर देखे जा सकते हैं
#
# 1 million files
# ===============
#
# |time |new dir |Files added in ASCENDING order
# +---- +------- +-------------------------------------------------
# real 01m 33s Add files only (ASCENDING order) ...just for ref.
# real 02m 04s Add files, and make 'rm' source (ASCENDING order)
# Add files, and make 'rm' source (DESCENDING order)
# real 00m 01s Count of filenames
# real 00m 01s List of filenames, one per line
# ---- ------- ------
# real 01m 34s 'rm -rf dir'
# real 01m 33s 'rm filename' via rm1000filesPerCall (1000 files per 'rm' call)
# real 01m 40s 'rm filename' via ASCENDING algorithm (1000 files per 'rm' call)
# real 01m 46s 'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
# real 21m 14s 'rm -r dir'
# real 21m 27s 'find dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
# real 21m 56s 'find dir -name "hello*" -delete'
# real 23m 09s 'find dir -name "hello*" -print0 | xargs -0 -P 0 rm'
# real 39m 44s 'rm filename' (one file per rm call) ASCENDING
# real 47m 26s 'rm filename' (one file per rm call) UNSORTED
#
मैंने हाल ही में 10 मिलियन खाली परीक्षण फ़ाइलों को बनाया और हटा दिया है । नाम के आधार (नाम rm filename) के आधार पर फ़ाइलों को हटाना , मुझे यह पता चला है कि 2 अलग-अलग तरीकों के बीच बहुत बड़ा समय अंतर है ...
दोनों विधियाँ सटीक समान rm filenameकमांड का उपयोग करती हैं ।
अपडेट: जैसा कि यह पता चला है, कमांड बिल्कुल समान नहीं थे ... उनमें से एक एक समय में 1000 फ़ाइलनामों को 'आरएम' भेज रहा था ... यह एक शेल ब्रेस-एक्सपेंशन मुद्दा था जहां मुझे लगा कि प्रत्येक फ़ाइल नाम लिखा जा रहा है फीडर फ़ाइल की अपनी लाइन पर, लेकिन वास्तव में यह 1000 प्रति लाइन थी
Filnames एक में एक 'फीडर फ़ाइल' के माध्यम से प्रदान कर रहे हैं while readपाश ..
फीडर फ़ाइल का आउटपुट है ls -1 -f
तरीकों सभी reaspects में समान हैं, एक बात को छोड़कर:
- धीमी गति से विधि से प्रत्यक्ष अवर्गीकृत फीडर फ़ाइल का उपयोग करता है
ls -1 -f - तेजी से विधि है कि एक ही अवर्गीकृत फ़ाइल की एक क्रमबद्ध संस्करण का उपयोग करता
मुझे यकीन नहीं है कि क्या छांटना ths मुद्दा है, या यह है कि शायद हल किया हुआ फीडर फ़ाइल सिर्फ उस अनुक्रम से मेल खाने के लिए होता है जिसमें फाइलें बनाई गई थीं (मैंने एक सरल आरोही पूर्णांक एल्गोरिदम का उपयोग किया था)
1 मिलियन फ़ाइलों के लिए, फास्ट rm filename विधि धीमी विधि की तुलना में 60 गुना तेज है ... फिर से, मुझे नहीं पता कि क्या यह "छँटाई" मुद्दा है, या एक पीछे-हैश टेबल इश्यू ... मुझे संदेह है यह एक साधारण छंटनी का मुद्दा नहीं है, क्योंकि जानबूझकर मुझे फ़िल्मी नामों के एक नए सिरे से जोड़े गए "क्रमबद्ध" अनुक्रम की एक अंतहीन सूची दी जाएगी ... ls -1 -f
मैं सोच रहा हूँ कि यहाँ क्या हो रहा है, इसलिए अगली 10 मिलियन फ़ाइलों को हटाने के लिए मुझे दिन (हाँ दिन) नहीं लगते हैं :) .... मैं कहता हूँ "दिन" क्योंकि मैंने बहुत सारे विकल्पों की कोशिश की, और कई बार शामिल नंबर फ़ाइल में असमानता बढ़ जाती है .. इसलिए मैंने केवल 1 मिलियन का विस्तार से परीक्षण किया है
बीटीडब्ल्यू: नामों की "सॉर्ट की गई सूची" के माध्यम से फ़ाइलों को हटाना वास्तव rm -rfमें 2 के कारक से तेज है
और: rm -r"सॉर्ट की गई सूची" विधि की तुलना में 30 गुना धीमा था।
... लेकिन यहाँ "" हल किया गया है? या यह हैशिंग (या जो कुछ भी) ext4 द्वारा उपयोग की जाने वाली विधि से संबंधित है?
जो चीज मुझे काफी अचंभित करती है, वह यह है कि प्रत्येक कॉल rm filenameपिछले एक से संबंधित नहीं है .. (ठीक है, कम से कम यह 'बैश' के नजरिए से ऐसा है)
मैं Ubuntu / bash / 'ext4' / SATA II ड्राइव का उपयोग कर रहा हूं।
cat1 टेस्ट से पहले एक ताजा फ़ाइल के लिए एक सरल करना चाहिए - sort2 वें परीक्षण से पहले।
find -delete?