मेरे पास तीन प्रकार के डेटा हैं जो विभिन्न स्वरूपों में हैं; प्रत्येक डेटा प्रकार के लिए, एक पायथन स्क्रिप्ट है जो इसे एकल एकीकृत प्रारूप में बदल देती है।
यह पायथन लिपि धीमी और सीपीयू-बाउंड (मल्टी-कोर मशीन पर सिंगल कोर के लिए) है, इसलिए मैं इसके तीन उदाहरणों को चलाना चाहता हूं - प्रत्येक डेटा प्रकार के लिए एक - और इसे पास करने के लिए उनके आउटपुट को मिलाएं sort
। मूल रूप से, इसके बराबर:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
लेकिन समानांतर में चलने वाली तीन लिपियों के साथ।
मुझे यह प्रश्न मिला कि जीएनयू split
का उपयोग स्क्रिप्ट के n उदाहरणों के बीच कुछ स्टडआउट स्ट्रीम को राउंड-रॉबिन करने के लिए किया जा रहा था जो स्ट्रीम को संभालता है।
विभाजित मैन पेज से:
-n, --number=CHUNKS
generate CHUNKS output files. See below
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distributio
तो r/N
कमांड का अर्थ है " बिना विभाजन लाइनों के "।
इसके आधार पर, ऐसा लगता है कि निम्नलिखित समाधान संभव होना चाहिए:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
यह कहाँ choose_script
होता है:
#!/bin/bash
{ read x; ./handle_$x.py; }
दुर्भाग्य से, मैं लाइनों के कुछ परस्पर क्रिया को देखता हूं - और बहुत सी नई कहानियां जो वहां नहीं होनी चाहिए।
उदाहरण के लिए, यदि मैं अपनी पायथन लिपियों को कुछ सरल बैश लिपियों से बदलूं जो ऐसा करती हैं:
#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;
।
#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;
।
#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;
मैं यह आउटपुट देखता हूं:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
यह कष्टप्रद है - ऊपर दिए गए मैन पेज एक्सट्रेक्ट के आधार पर, इसे लाइन की अखंडता बनाए रखना चाहिए।
जाहिर है कि यह काम करता है अगर मैं -u
तर्क को हटा देता हूं , लेकिन फिर यह बफ़र हो गया है और मैं मेमोरी से बाहर चला जाऊंगा क्योंकि यह सभी स्क्रिप्ट्स के आउटपुट को बफ़र करता है।
अगर किसी को यहाँ कुछ अंतर्दृष्टि है यह बहुत सराहना की जाएगी। मैं यहाँ अपनी गहराई से बाहर हूँ।
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
कि मैं बैश में बिलिन को देखता हूं, हालांकि मैं वास्तव में नहीं देखता कि यह कैसे लागू होता है।