সমান্তরাল প্রক্রিয়াকরণের সাথে আরও ভাল ইউনিক্স সন্ধান করতে পারেন?


43

ইউনিক্স find(1)ইউটিলিটি আমাকে অনেকগুলি ফাইলের সাথে একটি ক্রিয়া সম্পাদন করতে দেয় যা নির্দিষ্ট নির্দিষ্টকরণের সাথে মেলে, যেমন খুব দরকারী

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

উপরেরগুলি কোনও বিশেষ ডিরেক্টরিতে প্রতিটি এক্সএমএল ফাইলের উপর স্ক্রিপ্ট বা সরঞ্জাম চালাতে পারে।

ধরা যাক আমার স্ক্রিপ্ট / প্রোগ্রামে অনেকগুলি সিপিইউ সময় লাগে এবং আমার 8 টি প্রসেসর রয়েছে। একসাথে 8 টি পর্যন্ত ফাইল প্রক্রিয়া করা ভাল হবে।

জিএনইউ মেক -jফ্ল্যাগের সাথে সমান্তরাল কাজের প্রক্রিয়াকরণের অনুমতি দেয় তবে এর findমতো কার্যকারিতা উপস্থিত হয় না। এটির কাছে যাওয়ার কোনও বিকল্প জেনেরিক কাজ-নির্ধারিত পদ্ধতি আছে?

উত্তর:


65

xargsসঙ্গে -Pবিকল্প (প্রক্রিয়ার নম্বর)। বলুন যে আমি 4-সিপিইউ মেশিনে একটি ডিরেক্টরিতে সমস্ত লগফিলগুলি সংকুচিত করতে চেয়েছিলাম:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

আপনি -n <number>প্রক্রিয়া প্রতি সর্বাধিক সংখ্যক ওয়ার্ক-ইউনিটগুলির জন্যও বলতে পারেন । সুতরাং বলুন আমার কাছে 2500 ফাইল ছিল এবং আমি বলেছিলাম:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

এটি 4 টি bzip2প্রক্রিয়া শুরু করবে , যার প্রত্যেকটিতে 500 টি ফাইল থাকবে এবং তারপরে প্রথমটি শেষ করার পরে শেষ 500 টি ফাইলের জন্য শুরু করা হবে।

পূর্ববর্তী উত্তরটি কেন ব্যবহার করে তা নিশ্চিত নন xargs এবং make , আপনার কাছে দুটি সমান্তরাল ইঞ্জিন রয়েছে!


7
Find / xargs এর সাথে সাবধান থাকুন: আউটপুট ডিলিমিটার হিসাবে নিউলাইনগুলিতে ডিফল্ট সন্ধান করুন, তবে ইনপুট ডিলিমিটার হিসাবে কোনও হোয়াইটস্পেসে ডিফল্ট xargs। নিরাপদ থাকতে উভয়টিতে -0 ব্যবহার করুন বা জিএনইউ সমান্তরালে স্যুইচ করুন যা নিউলাইনগুলিতে ডিফল্ট হিসাবে ইনপুট ডিলিমিটার (সন্ধানের আউটপুটটির সাথে মিল রয়েছে)।
প্রশংসাপত্র

1
ওহ অনেক সুন্দর! আমি কেবল যাচাই করেছি, এবং এটি সত্য, এক্সার্গসের একটি -Pবিকল্প আছে!
পিপি

ব্যবহার সম্পর্কে সতর্ক থাকুন xargs -P- এতে আউটপুট গার্বলিংয়ের একটি কখনও স্থির বাগ নেই (বিপরীতে parallel) যখনই 2 টি থ্রেড একই সঠিক মুহূর্তে আউটপুট উত্পাদন করে ...
ভ্লাদ

34

জিএনইউ সমান্তরালও সাহায্য করতে পারে।

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

মনে রাখবেন যে -j8তর্ক ছাড়াই parallelআপনার মেশিনে কোরগুলির সংখ্যার তুলনায় ডিফল্ট :-)


6

"সংশোধন" করার দরকার নেই find- makeপ্যারালালিজম হ্যান্ডেল করার জন্য নিজের ব্যবহার করুন ।

আপনার প্রক্রিয়াটি একটি লগ ফাইল বা অন্য কোনও আউটপুট ফাইল তৈরি করতে এবং তারপরে একটি মেকফিল ব্যবহার করুন:

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

এবং অনুরোধ:

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

আরও ভাল, আপনি যদি নিশ্চিত হন যে আউটপুট ফাইলটি কেবলমাত্র জাভা প্রক্রিয়াটির সফল সমাপ্তির পরে তৈরি হয়েছে তবে আপনি makeকেবলমাত্র অপ্রক্রিয়িত ফাইলের কাছাকাছি সময়ে তা নিশ্চিত করার জন্য নির্ভরতা হ্যান্ডলিংয়ের সুবিধা নিতে পারবেন ।


1
আশা করি এই ফাইলগুলির নামগুলিতে কোনও স্থান বা অন্যান্য "আকর্ষণীয়" অক্ষর নেই; Make এগুলি খুব মার্জিতভাবে পরিচালনা করে না।
প্রশংসিত

চমৎকার ধারণা! কখনও মেকফাইল ব্যবহার করার কথা ভাবেননি।
oscfri

3

সন্ধানের একটি সমান্তরাল বিকল্প রয়েছে যা আপনি সরাসরি "+" চিহ্ন ব্যবহার করে ব্যবহার করতে পারেন; কোন xargs প্রয়োজন। এটিকে গ্রেপের সাথে সংমিশ্রণ করে, এটি আপনার গাছের মধ্যে দ্রুত ম্যাচগুলির সন্ধান করতে পারে p উদাহরণস্বরূপ, আমি যদি আমার উত্স ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করছি তবে 'foo' স্ট্রিং রয়েছে, আমি আবেদন করতে পারি
find sources -type f -exec grep -H foo {} +


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