টার্মিনালে মাল্টি থ্রেডেড গ্রেপ কীভাবে শুরু করবেন?


38

আমার কাছে একটি ফোল্ডার রয়েছে যার প্রতি 2 জিবি 250+ ফাইল রয়েছে। আমাকে সেই ফাইলগুলিতে স্ট্রিং / প্যাটার্ন অনুসন্ধান করতে হবে এবং ফলাফলটি কোনও outputফাইলে আউটপুট করতে হবে। আমি জানি আমি নিম্নলিখিত কমান্ডটি চালাতে পারি তবে এটি খুব ধীর !!

grep mypattern * > output

আমি এটি দ্রুত করতে চাই জাভাতে একজন প্রোগ্রামার হওয়ার কারণে আমি জানি যে প্রক্রিয়াটি দ্রুত করার জন্য মাল্টি-থ্রেডিং ব্যবহার করা যেতে পারে। আমি grep"মাল্টি-থ্রেডেড মোডে" কীভাবে শুরু করব এবং আউটপুটটিকে একটি outputফাইলে লিখব তা নিয়ে আমি আটকে আছি ।




1
অবশ্যই ফাইলগুলির একটি বৃহত সংগ্রহ অনুসন্ধান করা আইও আবদ্ধ একটি ক্লাসিক উদাহরণ। অতএব একাধিক থ্রেড ব্যবহার সাহায্য করবে না।
জোনাথন হার্টলি

উত্তর:


31

এর জন্য দুটি সহজ সমাধান রয়েছে। মূলত, ব্যবহার xargsবা parallel

xargs পদ্ধতির:

আপনি ব্যবহার করতে পারেন xargsসঙ্গে findনিম্নরূপ:

find . -type f -print0  | xargs -0 -P number_of_processes grep mypattern > output

যেখানে আপনি number_of_processesচালু হতে চান সর্বাধিক সংখ্যক প্রক্রিয়া দ্বারা প্রতিস্থাপন করবেন । তবে আপনার পারফরম্যান্স I / O সীমাবদ্ধ হলে এটি আপনাকে একটি গুরুত্বপূর্ণ পারফরম্যান্স দেওয়ার গ্যারান্টিযুক্ত নয়। এই ক্ষেত্রে আপনি I / Os এর অপেক্ষায় থাকা সময়ের জন্য ক্ষতিপূরণ দিতে আরও প্রক্রিয়া শুরু করার চেষ্টা করতে পারেন।

এছাড়াও, অনুসন্ধানের অন্তর্ভুক্তির সাথে আপনি কেবলমাত্র ফাইলের ধরণগুলির পরিবর্তে আরও উন্নত বিকল্পগুলি নির্দিষ্টকরণের সময় ইত্যাদির মতো নির্দিষ্ট করতে পারেন ...

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

সমান্তরাল পদ্ধতি:

এটি করার আরেকটি উপায় হ'ল ওলে ট্যাঞ্জ জিএনইউ সমান্তরাল সরঞ্জামটি ব্যবহার করা parallel( এখানে উপলভ্য )। এটি সমান্তরালতার তুলনায় বৃহত্তর সূক্ষ্ম শস্য নিয়ন্ত্রণ সরবরাহ করে এবং একাধিক হোস্টের মধ্যেও বিতরণ করা যায় (উদাহরণস্বরূপ আপনার ডিরেক্টরিটি ভাগ করা থাকলে উপকারী হবে)। সমান্তরাল ব্যবহার করে সবচেয়ে সহজ বাক্য গঠন হবে:

find . -type f | parallel -j+1 grep mypattern

বিকল্পটি -j+1আপনার মেশিনে কোরের সংখ্যার চেয়ে বেশি পরিমাণে একটি প্রক্রিয়া শুরু করার জন্য সমান্তরালকে নির্দেশ দেয় (এটি I / O সীমিত কাজের জন্য সহায়ক হতে পারে, আপনি সংখ্যায় আরও বেশি করে যাওয়ার চেষ্টাও করতে পারেন)।

সমান্তরাল এছাড়াও xargsপ্রতিটি প্রক্রিয়া থেকে আউটপুট ক্রম বজায় রাখা এবং একটি স্বতন্ত্র আউটপুট উত্পন্ন করার সুবিধা আছে। উদাহরণস্বরূপ, এর সাথে xargs, যদি প্রক্রিয়া 1 একটি লাইন উত্পন্ন করে বলে p1L1, প্রক্রিয়া 2 একটি লাইন p2L1উত্পন্ন করে, প্রক্রিয়া 1 অন্য একটি লাইন উত্পন্ন করে p1L2, আউটপুটটি হবে:

p1L1
p2L1
p1L2

যেখানে parallelআউটপুটটি হওয়া উচিত:

p1L1
p1L2
p2L1

এটি সাধারণত xargsআউটপুট চেয়ে বেশি দরকারী ।


1
আপনি সম্ভবত এর -nসাথে সংমিশ্রণে ব্যবহার করতে চান -P। অন্যথায়, xargsযদি দুটি কয়েকটি ফাইল থাকে তবে বেশ কয়েকটি প্রক্রিয়া শেষ হবে না।
স্টাফেন শেজেলাস

1
ওয়েল, -n1 grepফাইল প্রতি এক শুরু হবে। যদি ফাইলগুলি খুব বড় না হয় এবং সেগুলির মধ্যে খুব অল্প পরিমাণে না থাকে তবে আপনি সম্ভবত ফাইলগুলি অনুসন্ধান করার পরিবর্তে গ্রেপ প্রক্রিয়াগুলি শুরু করতে এবং থামিয়ে আপনার সময় ব্যয় করায় কিছুটা বাড়িয়ে দিতে চাইবেন।
স্টাফেন শেজেলাস

9

গ্রেপ সিপিইউ ভিত্তিক গতি বাড়ানোর কমপক্ষে দুটি উপায় রয়েছে:

  • আপনি যদি নিয়মিত অভিব্যক্তির চেয়ে স্থির স্ট্রিংটির সন্ধান করে থাকেন তবে -Fপতাকাটি নির্দিষ্ট করুন ;

  • যদি আপনার প্যাটার্নটি কেবলমাত্র ASCII- হয় তবে UTF-8 এর পরিবর্তে 8-বিট লোকেল ব্যবহার করুন, যেমন LC_ALL=C grep ...

আপনার হার্ড ড্রাইভ যদি বাধা হয়ে থাকে তবে এগুলি সাহায্য করবে না; সেক্ষেত্রে সম্ভবত প্যারালালাইজিং কোনওভাবেই সহায়তা করবে না।


1
man grepসবেমাত্র দেখেছেন "যেমন egrep বা fgrep হ্রাস করা হয়েছে হিসাবে সরাসরি অনুরোধ, তবে historicalতিহাসিক অ্যাপ্লিকেশনগুলিকে যা অবিস্মরণীয়ভাবে চালানোর জন্য তাদের উপর নির্ভর করে allow" নিশ্চিত না যে এটি সত্যই গুরুত্বপূর্ণ, তবে একই রকমgrep -F
আইরিন

1
এছাড়াও যখন আপনি "কোনও প্যাটার্নের পরিবর্তে" বলছেন আপনি কি নিয়মিত অভিব্যক্তির কথা উল্লেখ করছেন?
আইরিন

"ASCII- কেবল" অনুসন্ধানটি ব্যাপকভাবে কম CPU ব্যবহার করে। কিন্তু আপনি এ আদেশ সহকারে মন্তব্য উল্লেখ পড়া প্রয়োজন stackoverflow.com/a/11777835/198219
famzah

3

যদি সমস্যা I / O সীমাবদ্ধ না হয় আপনি একটি সরঞ্জাম ব্যবহার করতে পারেন যা মাল্টি-কোর প্রসেসিংয়ের জন্য অনুকূলিত।

আপনি সিফট ( http://sift-tool.org , অস্বীকৃতি: আমি এই সরঞ্জামটির লেখক) বা রূপালী অনুসন্ধানকারী ( https://github.com/ggreer/the_silver_searcher ) এ একবার দেখতে চাইতে পারেন।

আপনি যদি একটি রেইগেক্স প্যাটার্ন ব্যবহার করেন এবং একটি স্পিম্পল স্ট্রিং অনুসন্ধান না করে সিলভার সন্ধানকারীটির ফাইল আকারের সীমা 2GB থাকে।


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