ইউনিক্স গ্রেপ কি দীর্ঘ বা সংক্ষিপ্ত অনুসন্ধানের পদগুলির সাথে দ্রুত কাজ করে?


8

দীর্ঘ বা সংক্ষিপ্ত অনুসন্ধানের শব্দগুলি অনুসন্ধান করা কি দ্রুত? বা এটি আদৌ গতিকে প্রভাবিত করে? অন্য কথায়, আপনার কি অনুসন্ধানের শব্দগুলি যথাসম্ভব যথাযথ করা উচিত?

এখানে ১০০ হাজারেরও বেশি ফাইল রয়েছে এবং প্রতিটি ফাইলে ২০ থেকে ২০ হাজার সারি ডেটা থাকে। সাধারণত গ্রেপ অনুসন্ধান শব্দটির একটি উদাহরণ খুঁজে পেতে ব্যবহৃত হয়।

চলুন যাক অনুসন্ধান শব্দটি হ'ল SEARCHTERM, এবং এটি এইর মতো একটি সারিতে থাকবে:

NAD+DP+1234567890:92++UNIQUE+NAME+SEARCHTERM++12345+FI'

"অনুসন্ধান" বা "অনুসন্ধানের" অনুসন্ধান করা কি দ্রুত? আসুন আমরা বলি যে এই ক্ষেত্রে আমরা অন্যান্য অপ্রাসঙ্গিক লাইনেও ম্যাচগুলি খুঁজে পাই কিনা সে বিষয়ে আমাদের পাত্তা নেই।

আমি বর্তমানে এটি এটি করে:

grep NAD+DP 123* | grep SEARCHTERM

তবে আমি এটি বেশ ধীর, এখনও মনে করি। এটি প্রায় 3-5 মিনিট সময় লাগে ডেটা সন্ধান করতে, এমনকি আমি যখন মোটামুটি ফাইল নাম জানি, যা প্রায় 10 000 ফাইলের মধ্যে সীমাবদ্ধ করে।

সুতরাং, একটি দীর্ঘ বা সংক্ষিপ্ত অনুসন্ধান শব্দ সাহায্য করবে? আমি যতদূর জানি গ্রেপ একটি নির্দিষ্ট দৈর্ঘ্যের শব্দের "ব্লক" সন্ধান করে?

উত্তর:


8

কিছু রেফারেন্স উপাদান:

জিএনইউ গ্রেপ সুপরিচিত বায়ার-মুর অ্যালগরিদম ব্যবহার করে, যা লক্ষ্য স্ট্রিংয়ের চূড়ান্ত অক্ষরের জন্য প্রথম দেখায় এবং যখন কোনও মিল না পাওয়া অক্ষর খুঁজে পায় তখন ইনপুটটিতে কতটা এগিয়ে যেতে পারে তা জানাতে একটি অনুসন্ধান সারণী ব্যবহার করে।

থেকে কেন গনুহ, grep দ্রুত

আলগোরিদিম স্ট্রিংটির (প্যাটার্ন) অনুসন্ধান করা হচ্ছে, তবে স্ট্রিংটি (পাঠ্য) তে অনুসন্ধান করা হচ্ছে না prep [...] সাধারণভাবে, প্যাটার্নের দৈর্ঘ্য বাড়ার সাথে সাথে অ্যালগরিদম দ্রুত চলে।

বয়ের থেকে – মুর স্ট্রিং অনুসন্ধানের অ্যালগরিদম

উপসংহার: দীর্ঘতর স্ট্রিং ব্যবহার করুন

এখন, মজার জন্য কিছুটা মানদণ্ড:

# Initialisation
cd $(mktemp -d) && dd if=/dev/urandom of=random bs=1M count=1000
# Version
grep --v` # grep (GNU grep) 2.9
# Benchmark
(for s in 'short' 'this is not so short and we could even consider this as pretty long'; do for t in {1..10}; do time grep "$s" random; done; done ) 2> result

ফলাফল: 0.952s হ'ল সংক্ষিপ্ত স্ট্রিংয়ের গড়, 0.244 লম্বা স্ট্রিংয়ের গড় the

নোট : দৈর্ঘ্যটি একমাত্র বিবেচনার জন্য বিবেচনা করা হবে না।


0

আপনি সন্ধান বা অনুসন্ধানের মাধ্যমে নিজেকে চেষ্টা করতে পারেন। দুটি গ্রেপ কমান্ডের ক্রম পরিবর্তন করার চেষ্টা করুন। যাইহোক, একমাত্র দরকারী বিকল্পটি সম্ভবত এক সন্ধানের জন্য বেশ কয়েকটি সিপিইউ কোর ব্যবহার করা হবে। parallelকমান্ড দেখুন ।


0

আমি মনে করি না যে আরও সুনির্দিষ্ট অনুসন্ধান শব্দটি নির্দিষ্ট করা এটি লক্ষণীয়ভাবে দ্রুততর করবে।

অনুসন্ধান করার জন্য অনেকগুলি ফাইল সহ, আপনার অনুসন্ধানটি আরও দ্রুত করতে আপনার ডেটা কোনওভাবে ইনডেক্স করতে হবে।

আমি কয়েকটি উপায় প্রস্তাব করতে পারি:

  • ডাটাবেস তৈরি করুন (PostgreSQL বা মাইএসকিউএল), আপনার ডেটাবেস ডাটাবেসে আমদানি করুন - এক সারিতে একটি ফাইল, এফটিএস (সম্পূর্ণ পাঠ্য অনুসন্ধান) সূচক যুক্ত করুন। ডাটাবেস জিজ্ঞাসা করার জন্য কিছু ইউটিলিটি তৈরি করুন।

  • ডাটাবেসে আরও দানাদার উপায়ে ডেটা আমদানি করুন, সম্ভবত এক সারি এক সারিতে (বা একাধিক টেবিলের চেয়ে বেশি), সূচি তৈরি করুন যাতে সূচি (এস) ব্যবহার করে আপনার ডেটা অনুসন্ধানযোগ্য। ডাটাবেস জিজ্ঞাসা করার জন্য কিছু ইউটিলিটি তৈরি করুন।

  • আপনার ফাইলগুলি gitসংগ্রহস্থলে যুক্ত করুন, এটি ব্যবহার করে সংক্ষিপ্ত করুন git gc, git grepঅনুসন্ধানের জন্য ব্যবহার করুন। আমার অভিজ্ঞতায়, 10x-100x এর গুণক অনুসারে git grepমানের চেয়ে দ্রুততর হতে পারে grep


0

যৌক্তিকভাবে, একটি সংক্ষিপ্ত মেয়াদে কম সিপিইউ সময় লাগবে, যেমনটি grepহবে

if (filechar[i] == pattern[i]) ...

কম বার। বাস্তবে, আমি অনুমান করব যে একটি grepI / O- আবদ্ধ হবে এবং সিপিইউ-আবদ্ধ নয়, তাই এটি কোনও ব্যাপার নয়।


1
আশ্চর্যজনকভাবে যথেষ্ট, গ্রেপ সত্যিকারের স্মার্ট অ্যালগরিদম ব্যবহার করায় এটি ভুল, দয়া করে আমার উত্তরটি দেখুন।
সিলভাইনডি

অনুসন্ধানের স্ট্রিংটি যত দীর্ঘ হবে, কোনও মিল না পাওয়া গেলে এটি আরও অক্ষরগুলি এড়িয়ে যেতে পারে, অতএব অনুসন্ধানটি আরও
ত্বরান্বিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.