গ্রাফিকাল ফাইল অনুসন্ধান ইউটিলিটির তুলনায় জিএনইউ এত দ্রুত খুঁজে পাচ্ছে কেন?


47

আমি যে ফাইলটি খুঁজে বের করার চেষ্টা করছি না আমার হোম ডিরেক্টরি ও সমস্ত সাব-রয়েছে।

find ~/ -name "bogus"কয়েক সেকেন্ড পরে আমাকে সেই তথ্য দেয়, তবুও কেডিএর dolphinফাইল ম্যানেজারকে এটি করতে প্রায় 3 মিনিটের প্রয়োজন ছিল। এটি জিনোমেরbeagle সাথে আমার আগের অভিজ্ঞতার সাথে মিলে যায় ।

findগ্রাফিকাল অনুসন্ধান (কমান্ডলাইন প্যারামিটারগুলির তুলনায় যা আরও স্বজ্ঞাত) পিছনে স্লাগগুলি কীভাবে একই দ্রুত পরিচালনা করতে পারে?


আমি জানি না কি হবে "ডলফিন", কিন্তু এটা হয়তো আরো কেমন ভিতরে ফাইল?
কুসালানন্দ

1
এটি কেডিএর একটি গ্রাফিকাল ফাইল ম্যানেজার: kde.org/applications/s systemm / dolphin এতে ফাইলগুলির মধ্যে অনুসন্ধান করার ক্ষমতা রয়েছে তবে আমি এই সংক্ষিপ্ত পরীক্ষার সময় সেই বিকল্পটি সক্ষম করেছিলাম না।
লাল

9
আপনি কি ডলফিনে একাধিকবার অনুসন্ধান করেছেন? এটি প্রথমবার "সূচক" হতে পারে। এবং "সন্ধান" খুব ধীর। "চিহ্নিত" চেষ্টা করুন যদি ফাইলটি শেষ বারের চেয়ে বেশি বয়সে সনাক্ত করার জন্য ডাটাবেসটি সূচী করা হয়েছিল ;-)
রিনজুইন্ড

আমি এর locateচেয়ে বেশি বার ব্যবহার করি findএবং এটি একটি বিশাল ফোল্ডারে দ্রুত
ফুচলভি

11
যখন locateফাইল খুজে বের করার সত্যিই মহান, এই একটু সম কারণ এটি একটি সম্পূর্ণ ভিন্ন পদ্ধতির ব্যবহার করে: findএবং গুই সরঞ্জামের মত Dolphin, চাহিদা ফাইল গাছ ঢোঁড়ন করছেন locateএকটি পূর্বে তৈরি সূচক গঠন ব্যবহার করছে।
মাইকেল শ্যাফার্স

উত্তর:


68

বালুর সাথে বিশেষত ডলফিনের দিকে তাকানো দেখে মনে হচ্ছে এটির সন্ধান ডোমেনের প্রতিটি ফাইলের মেটাডেটা সন্ধান করা হবে, এমনকি আপনি যদি একটি সাধারণ ফাইল নাম অনুসন্ধান করেন তবে। যখন আমি ট্রেস file.soপ্রক্রিয়া, আমি কল দেখতে lstat, getxattrএবং getxattrআবার যে ফাইলের জন্য, এবং এমনকি জন্য ..এন্ট্রি। এই সিস্টেম কলগুলি ফাইলের নাম থেকে মেটাডেটা পুনরুদ্ধার করে যা ফাইলের নাম থেকে পৃথক স্থানে সঞ্চিত হয় (ফাইলের নাম ডিরেক্টরি সামগ্রীতে সংরক্ষিত থাকে তবে মেটাডেটা ইনোডে থাকে )। একাধিকবার কোনও ফাইলের মেটাডেটা জিজ্ঞাসা করা সস্তা, যেহেতু ডেটা ডিস্ক ক্যাশে থাকবে তবে মেটাটাটা জিজ্ঞাসা করা এবং মেটাটাটা অনুসন্ধান না করার মধ্যে একটি উল্লেখযোগ্য পার্থক্য থাকতে পারে।

findঅনেক বেশি চালাক। এটি অপ্রয়োজনীয় সিস্টেমের কলগুলি এড়ানোর চেষ্টা করে। এটি কল করবে না getxattrকারণ এটি বর্ধিত বৈশিষ্ট্যের ভিত্তিতে অনুসন্ধান করে না। যখন এটি কোনও ডিরেক্টরিকে ট্র্যাভার করে, তখন এটি lstatঅ-মিলের ফাইল নামগুলি কল করতে হতে পারে কারণ এটি পুনরাবৃত্তভাবে অনুসন্ধান করার জন্য একটি উপ-ডিরেক্টরি হতে পারে ( lstatনিয়মিত / ডিরেক্টরি / সিমলিংক /… এর মতো ফাইল টাইপ সহ ফাইল মেটাডেটা প্রত্যাবর্তনকারী সিস্টেম কল)) তবে findএকটি অপ্টিমাইজেশন রয়েছে: এটি একটি লিঙ্ক গণনা থেকে একটি ডিরেক্টরি কতগুলি উপ-ডিরেক্টরি আছে lstatতা জানে এবং এটি একবারে জেনে যায় যে এটি সমস্ত সাব-ডাইরেক্টরিগুলিকে অনুসরণ করেছে। বিশেষত, একটি পাতায় ডিরেক্টরিতে (কোনও ডিরেক্টরি ডিরেক্টরি নয়)findকেবলমাত্র নামগুলি পরীক্ষা করে, মেটাডেটা নয়। এছাড়াও কিছু ফাইল-সিস্টেম ডিরেক্টরি এন্ট্রি-তে ফাইল টাইপের একটি অনুলিপি findরাখে যাতে lstatকেবল এটির প্রয়োজনীয় তথ্য যদি কল করার প্রয়োজন হয় না ।

আপনি যদি findমেটাডেটা যাচাই করার জন্য প্রয়োজনীয় বিকল্পগুলি চালিয়ে যান lstatতবে এটি আরও কল করবে, তবে lstatতথ্যের প্রয়োজন না হলে এটি কোনও ফাইলে কল দেবে না (উদাহরণস্বরূপ কারণ ফাইলটি পূর্ববর্তী শর্ত দ্বারা বাদ দেওয়া হয়েছে) নামের সাথে মিলছে)।

আমি সন্দেহ করি যে অন্যান্য জিইআইআই অনুসন্ধান সরঞ্জামগুলি যে findচাকাটিকে পুনরায় উদ্বেগ করছে, একইভাবে কমান্ড লাইন ইউটিলিটির চেয়ে কম চালাক, যা কয়েক দশক ধরে অপ্টিমাইজেশন করেছে। ডলফিন, অন্ততপক্ষে, আপনি "সর্বত্র" অনুসন্ধান করলে ডেটাবেস ডাটাবেসটি ব্যবহার করার পক্ষে যথেষ্ট চালাক (সীমাবদ্ধতার সাথে যা ইউআইতে পরিষ্কার নয় যে ফলাফলগুলি পুরানো হতে পারে)।


22
জিএনইউ অনুসন্ধানটি এত "চালাক" যে এটি কিছু ফাইল সিস্টেমের ধরণের কিছু ফাইল মিস করে। জিএনইউ-র সুপরিচিত বাগটি হ'ল 2 + number of sub-directories.এটি একটি ডিরেক্টরিটির লিঙ্ক গণনা অবৈধ অনুমান করে যে এটি ইউনিক্স ভি 7 ফাইল সিস্টেম থেকে ডিজাইন বাগ প্রয়োগকারী ফাইল সিস্টেমগুলির জন্য কাজ করে তবে সমস্ত ফাইল সিস্টেমের জন্য নয়, যেহেতু এটি পসিক্স প্রয়োজনীয়তা নয় । আপনি যদি জিএনইউ মেকের জন্য একটি কার্যকর পারফরম্যান্স নম্বর পেতে চান, আপনার -noleafসঠিকভাবে আচরণ করতে জিএনইউকে বলার জন্য নির্দিষ্ট করতে হবে।
কার্যকরভাবে

12
@ শ্যাখিলি, জিএনইউর findঅনেক আগে এই বাগটি থাকতে পারে তবে আমি সন্দেহ করি যে -noleafআজকাল আপনাকে নিজের হাতে নির্দিষ্ট করার দরকার আছে এমন একটি মামলা খুঁজে পাবেন । কমপক্ষে getdents()(এবং রিডডিয়ার ()) লিনাক্সের এএএএএফসিটি, ইউডিএফ, আইএসও -৯6060০, বিটিআরএফ-তে যে ফাইলগুলি ডিরেক্টরী ফাইল রয়েছে সেগুলিতে প্রকৃত .বা ..এন্ট্রি নেই এবং findসেখানে ঠিক আছে আচরণ করে। আপনি কী এমন একটি ক্ষেত্রে জানেন যা জিএনইউ findসমস্যাটি দেখায় ?
স্টাফেন চেজেলাস

4
"গ্রাফট-পয়েন্ট" ব্যবহার করে একটি রক রিজ ফাইল সিস্টেম তৈরি করতে কেবল ডেবিয়ান থেকে এই পচা জিনোজাইমেজ ব্যবহার করুন এবং ডিরেক্টরিতে লিঙ্ক গণনা একটি এলোমেলো মান। যেহেতু রক রিজ একটি লিঙ্ক গণনা এবং। / .. প্রয়োগ করে, জিএনইউ অনুসন্ধান সাধারণত এই জাতীয় ফাইল সিস্টেমে সমস্ত ফাইল খুঁজে পাবে না।
সহজেই

4
@ স্টাফেনচাজেলাস: শেষবার যখন আমি পরীক্ষা করেছিলাম (আমার মাস্টারের থিসিসের জন্য), বাগটি ঠিক করা হয়েছিল ঠিক <= 2 এর চেয়ে 2 টি বোঝা পাতাকে বোঝানোর মাধ্যমে যে ফাইল সিস্টেমগুলি 2+ কাউন্টার বাস্তবায়ন করে না তারা ডিরেক্টরি লিঙ্ক গণনার জন্য 1 প্রদান করে তাই সবকিছু ভাল. এখন যদি কোনও দিন কোনও ফাইল সিস্টেম তৈরি করে যা এই সম্পত্তি না থাকা ডিরেক্টরিগুলির সাথে কঠোর লিঙ্ক করে, কারও খারাপ দিন হতে চলেছে।
জোশুয়া

15
@ শ্যাচিলি, আমি গ্রামীণ -পয়েন্টগুলির সাথে র্যান্ডম লিঙ্ক গণনাগুলি এবং দেবিয়ান-এ জেনিসোমাইজ 1.1.11 এর সাথে আরআর পেতে সক্ষম হইনি এবং এমনকি আমি আইসো চিত্রটিকে এলোমেলো মানগুলিতে লিঙ্ক গণনাগুলি পরিবর্তন করতে বাইনারি-সম্পাদনা করেও, আমি এখনও দেখতে পাচ্ছি না জিএনইউ নিয়ে সমস্যা find। এবং strace -vযে কোনও ক্ষেত্রে, প্রদর্শন করে যে getdents()সঠিকভাবে ডিরেক্টরিগুলির জন্য d_type = DT_DIR প্রদান করে, তাই GNU অনুসন্ধানের জন্য লিংক কাউন্ট ট্রিকটি ব্যবহার করতে হবে না।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.