समानांतर प्रसंस्करण के साथ एक बेहतर यूनिक्स मिला?


43

यूनिक्स find(1)उपयोगिता बहुत उपयोगी है जो मुझे कई विशिष्टताओं से मेल खाने वाली कई फाइलों पर कार्रवाई करने की अनुमति देती है, जैसे

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

ऊपर एक विशेष निर्देशिका में हर XML फ़ाइल पर एक स्क्रिप्ट या उपकरण चला सकता है।

मान लीजिए कि मेरी स्क्रिप्ट / प्रोग्राम में बहुत अधिक CPU समय लगता है और मेरे पास 8 प्रोसेसर हैं। एक बार में 8 फाइलों तक प्रोसेस करना अच्छा होगा।

GNU -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
ढूँढें / xargs के साथ, सावधान रहें: आउटपुट में सीमांकक के रूप में newlines के लिए डिफ़ॉल्ट ढूँढें, लेकिन xargs इनपुट सीमांकक के रूप में किसी भी व्हाट्सएप में चूक करता है। -0 का उपयोग सुरक्षित होने के लिए दोनों पर करें, या GNU समानांतर पर स्विच करें जो इनपुट डेलिमिटर (मिलान का आउटपुट का मिलान) के रूप में नईलाइनों में चूक करता है।
ephemient

1
वाह! अद्भुत! मैंने अभी जाँच की है, और यह सच है, xargs का एक -Pविकल्प है!
पीपी।

उपयोग करने से सावधान रहें xargs -P- इसमें आउटपुट को टटोलने की कभी भी नियत बग नहीं है (इसके विपरीत parallel) जब भी 2 धागे एक ही सटीक समय पर आउटपुट का उत्पादन करते हैं ...
व्लाद

34

जीएनयू समानांतर भी मदद कर सकता है।

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

ध्यान दें कि -j8तर्क के बिना , parallelआपकी मशीन पर कोर की संख्या के लिए चूक


6

"फिक्स" करने की आवश्यकता नहीं है find- makeसमानता को संभालने के लिए खुद का उपयोग करें ।

अपनी प्रक्रिया एक लॉग फ़ाइल या कुछ अन्य आउटपुट फ़ाइल बनाएँ, और फिर इस तरह एक Makefile का उपयोग करें:

.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
उम्मीद है कि उन फ़ाइलनामों में कोई स्थान या अन्य "दिलचस्प" पात्र नहीं हैं; बनाओ उन बहुत सुरुचिपूर्ण ढंग से संभाल नहीं है।
इफेमिएंट

उत्कृष्ट विचार! इस तरह से मेकअप का इस्तेमाल करने के बारे में कभी नहीं सोचा था।
ऑग्रेस

3

ढूंढें में एक समानांतर विकल्प है जिसे आप "+" प्रतीक का उपयोग करके सीधे उपयोग कर सकते हैं; कोई xargs की आवश्यकता है। इसे grep के साथ मिलाते हुए, यह आपके पेड़ के माध्यम से जल्दी से मैच की तलाश में चीर सकता है। उदाहरण के लिए, यदि मैं अपने स्रोतों की सभी फाइलों की तलाश कर रहा हूं जिसमें स्ट्रिंग 'फू' है, तो मैं आह्वान कर सकता हूं
find sources -type f -exec grep -H foo {} +


12
खोज नियमावली को पढ़ते हुए, आप देख सकते हैं कि -exec command +वाक्यविन्यास इसे समानांतर में नहीं चलाता है, लेकिन एक साथ कई फाइलों को "समूह" करता है और एक ही समय में कई फाइलों के साथ कमांड को तर्क के रूप में चलाता है। ऐसा होता है कि grep समानांतर में अपने लक्ष्यों को देख सकता है।
ग्यूकोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.