मेरे पास एक कार्य है जो स्टडिन पर फ़ाइलों की सूची संसाधित करता है। कार्यक्रम का स्टार्ट-अप समय पर्याप्त है, और प्रत्येक फ़ाइल के समय की मात्रा व्यापक रूप से भिन्न होती है। मैं इन प्रक्रियाओं की पर्याप्त संख्या को बढ़ाना चाहता हूं, फिर जो भी काम में व्यस्त नहीं हैं उन्हें प्रेषण करें। कई अलग-अलग कमांडलाइन उपकरण हैं जो लगभग वही करते हैं जो मैं चाहता हूं, मैंने इसे लगभग दो कामकाजी विकल्पों तक सीमित कर दिया है:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
समस्या यह है कि split
एक शुद्ध राउंड-रॉबिन करता है, इसलिए प्रक्रियाओं में से एक पीछे हो जाता है और पूरे ऑपरेशन के पूरा होने में देरी करता है; जबकि parallel
एन लाइनों या इनपुट के बाइट्स प्रति एक प्रक्रिया को स्पॉन करना चाहता है और मैं स्टार्टअप ओवरहेड पर बहुत अधिक समय खर्च कर रहा हूं।
क्या ऐसा कुछ है जो प्रक्रियाओं को फिर से उपयोग करेगा और जो भी प्रक्रियाएँ स्टैडिन को अनब्लॉक कर चुकी हैं, उन्हें फीड करेंगी?
myjob
अधिक इनपुट प्राप्त करने के लिए तैयार है। यह जानने का कोई तरीका नहीं है कि एक प्रोग्राम अधिक इनपुट को संसाधित करने के लिए तैयार है, आप सभी जान सकते हैं कि कुछ बफर कहीं (एक पाइप बफर, एक stdio बफर) अधिक इनपुट प्राप्त करने के लिए तैयार है। जब आप तैयार हों तो क्या आप अपने कार्यक्रम के लिए किसी प्रकार का अनुरोध भेजने का प्रबंध कर सकते हैं?
read
कॉल पर प्रतिक्रिया करता है वह चाल करेगा। यह काफी बड़ा प्रोग्रामिंग प्रयास है।
-l 1
में क्यों इस्तेमाल कर रहे हैं parallel
? IIRC, जो प्रति काम इनपुट की एक पंक्ति (यानी myjob के कांटे के प्रति एक फ़ाइल नाम, इतने सारे ओवरहेड ओवरहेड) को संसाधित करने के लिए समानांतर बताता है।
split
आज्ञा कहाँ से है? नाम मानक पाठ प्रसंस्करण उपयोगिता के साथ संघर्ष करता है ।