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


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

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

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

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

जीएनयू बनाने के साथ समानांतर नौकरी प्रसंस्करण के लिए अनुमति देता है -j ध्वज लेकिन find ऐसी कार्यक्षमता प्रतीत नहीं होती है। क्या इस के पास आने का वैकल्पिक जेनेरिक जॉब-शेड्यूलिंग तरीका है?


36
2017-10-21 09:07


मूल




जवाब:


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, आपके पास दो समांतर इंजन हैं!


51
2017-10-23 16:33



ढूंढने / xargs के साथ, सावधान रहें: आउटपुट डिलीमीटर के रूप में न्यूलाइन में डिफ़ॉल्ट खोजें, लेकिन xargs इनपुट डिलीमीटर के रूप में किसी भी सफेद स्थान पर डिफ़ॉल्ट रूप से चूक जाता है। दोनों सुरक्षित होने के लिए -0 का उपयोग करें, या जीएनयू समानांतर पर स्विच करें जो इनपुट डिलीमीटर (मिलान करने वाले आउटपुट के मिलान) के रूप में न्यूलाइन में चूक जाता है। - ephemient
वाह! अद्भुत! मैंने अभी जांच की है, और यह सच है, xargs एक है -P विकल्प! - PP.


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

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

ध्यान दें कि बिना -j8 तर्क, parallel आपकी मशीन पर कोर की संख्या के लिए डिफ़ॉल्ट :-)


28
2017-10-23 22:07





"ठीक करने" की कोई ज़रूरत नहीं है 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यह सुनिश्चित करने के लिए निर्भरता है कि अगली बार केवल अनप्रचारित फ़ाइलों को पूरा किया जाए।


5
2017-10-21 09:24



प्रतिभाशाली! धन्यवाद। - PP.
उम्मीद है कि उन फाइलनामों में कोई रिक्त स्थान या अन्य "रोचक" वर्ण नहीं हैं; उन बहुत सुंदर ढंग से संभाल नहीं है। - ephemient
उत्कृष्ट विचार! इस तरह मेकफ़ाइल का उपयोग करने के बारे में कभी सोचा नहीं। - oscfri


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


2
2018-05-30 09:15



खोज मैनुअल पढ़ना, आप इसे देख सकते हैं -exec command + सिंटैक्स इसे समानांतर में नहीं चलाता है, लेकिन एक साथ "समूह" कई फाइलें एक साथ और कई फ़ाइलों के साथ कमांड को एक ही समय में तर्क के रूप में चलाता है। ऐसा होता है कि grep समानांतर में अपने लक्ष्यों को देख सकता है। - Gyscos