ভুয়া পাস: "দ্রুত" পদ্ধতিটি আমি নীচে উল্লেখ করেছি, ধীরের চেয়ে 60 গুণ দ্রুত নয়। এটি 30 গুণ বেশি দ্রুত। আমি এই সময়ে ভুলটিকে দোষ দেব (3am স্পষ্ট ভাবনার জন্য আমার দিনের সেরা সময় নয় :) ..
আপডেট: আমি পরীক্ষার সময়ের সংক্ষিপ্তসার যোগ করেছি (নীচে)।
স্পিড ফ্যাক্টরের সাথে দুটি বিষয় জড়িত বলে মনে হচ্ছে:
- ব্যবহৃত কমান্ডের পছন্দ (নীচে প্রদর্শিত সময়ের তুলনা)
- ডিরেক্টরিতে প্রচুর সংখ্যক ফাইলের প্রকৃতি ... মনে হয় "বড়টি খারাপ"। সংখ্যা বাড়ার সাথে সাথে বিষয়গুলি অপ্রয়োজনীয়ভাবে ধীর হয়ে যায় ..
সমস্ত পরীক্ষা 1 মিলিয়ন ফাইল দিয়ে করা হয়েছে।
(বাস্তব, ব্যবহারকারীর এবং জটিল সময় পরীক্ষা স্ক্রিপ্টে রয়েছে)
পরীক্ষার স্ক্রিপ্টগুলি পেস্ট.বুন্টু.কম এ পাওয়া যাবে
#
# 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
কমান্ডটি ব্যবহার করে ।
আপডেট: দেখা যাচ্ছে যে কমান্ডগুলি হুবহু একই ছিল না ... তাদের মধ্যে একটি 'rm' তে একবারে 1000 ফাইলের নাম পাঠিয়েছিল ... এটি শেল ব্রেস-এক্সপেনশন সমস্যা ছিল যেখানে আমি ভেবেছিলাম প্রতিটি ফাইলের নাম লেখা হচ্ছে was তার নিজস্ব লাইনে ফিডার ফাইলটিতে, তবে আসলে এটি প্রতি লাইনে 1000 ছিল
ফিল্মের নামগুলি একটি 'ফিডার ফাইল' এর মাধ্যমে একটি while read
লুপে সরবরাহ করা হয় ..
ফিডার ফাইলটির আউটপুট ls -1 -f
পদ্ধতিগুলি একটি জিনিস ব্যতীত সমস্ত পুনর্বিবেচনায় একরকম:
- ধীর পদ্ধতি থেকে সরাসরি পাঁচমিশালী ফিডার ফাইল ব্যবহার
ls -1 -f
- ফাস্ট পদ্ধতি যে একই পাঁচমিশালী ফাইলের একটি সাজানো সংস্করণ ব্যবহার করে
আমি নিশ্চিত না যে এখানে বাছাই করা থইস ইস্যু কিনা, বা সম্ভবত যে বাছাই করা ফিডার ফাইলটি সেই ফাইলগুলির ক্রমটি মেলানোর জন্য ঘটেছিল (আমি একটি সাধারণ আরোহী পূর্ণসংখ্যার অ্যালগরিদম ব্যবহার করেছি)
1 মিলিয়ন ফাইলের জন্য, দ্রুত rm filename
পদ্ধতিটি ধীর পদ্ধতির চেয়ে 60 গুণ বেশি দ্রুত ... আবার, আমি জানি না এটি কোনও "বাছাই" সমস্যা, বা পর্দার অন্তর্গত হ্যাশ টেবিলের সমস্যা কিনা ... আমার সন্দেহ এটি একটি সহজ বাছাইয়ের সমস্যা নয় কারণ কেন ইচ্ছাকৃতভাবে আমাকে ফাইলনামগুলির একটি সদ্য যুক্ত হওয়া "সাজানো" ক্রমের তালিকাবিহীন তালিকা দেবে ... ls -1 -f
আমি এখানে কী চলছে তা ভাবছি, তাই পরবর্তী 10 মিলিয়ন ফাইল মুছতে আমার কয়েকদিন (হ্যাঁ দিনগুলি) লাগে না :) .... আমি "দিন" বলি কারণ আমি অনেকগুলি বিকল্প চেষ্টা করেছিলাম, এবং জড়িত সংখ্যক ফাইলের সাথে জড়িতদের সংখ্যা বাড়িয়ে তুলুন .. সুতরাং আমি কেবল বিশদে 1 মিলিয়ন পরীক্ষা করেছি
বিটিডাব্লু: নামগুলির "সাজানো তালিকার" মাধ্যমে ফাইলগুলি মুছে ফেলা আসলে rm -rf
২ এর ফ্যাক্টরের চেয়ে দ্রুত
এবং rm -r
এটি "সাজানো তালিকার" পদ্ধতির চেয়ে 30 গুণ ধীর ছিল
... তবে এখানে কি বিষয়টি "সাজানো" আছে? বা এটি ext4 দ্বারা ব্যবহৃত হ্যাশিং (বা যাই হোক না কেন) স্টোরেজ পদ্ধতির সাথে আরও সম্পর্কিত?
যে বিষয়টি আমাকে বেশ ধাঁধা দেয় তা rm filename
হ'ল প্রতিটি কলটি পূর্বের সাথে সম্পর্কিত নয় .. (ভাল, কমপক্ষে এটি 'বাশ' দৃষ্টিকোণ থেকে এমনভাবে হয়)
আমি উবুন্টু / বাশ / 'এক্সট 4' / সটা II ড্রাইভ ব্যবহার করছি।
cat
- প্রথম টেস্টের আগে আপনার একটি নতুন ফাইলের জন্য সহজ করা উচিত sort
।
find -delete
?