मैं कई "शर्मनाक समानांतर" परियोजनाओं में भाग लेता हूं जिन्हें मैं multiprocessing
मॉड्यूल के साथ समानांतर करना चाहता हूं। हालांकि, वे अक्सर बड़ी फाइलों (2 जीबी से अधिक) में पढ़ने, लाइन से लाइन को संसाधित करने, मूल गणना चलाने, और फिर परिणाम लिखने में शामिल होते हैं। फ़ाइल को विभाजित करने और पायथन के मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके इसे संसाधित करने का सबसे अच्छा तरीका क्या है? Queue
या JoinableQueue
multiprocessing
में उपयोग किया जाना चाहिए? या Queue
मॉड्यूल खुद ही? या, क्या मुझे multiprocessing
का उपयोग कर प्रक्रियाओं के पूल पर फ़ाइल को पुन: प्रयोज्य करना चाहिए? मैंने इन दृष्टिकोणों के साथ प्रयोग किया है लेकिन लाइन के आधार पर डेटा लाइन वितरण में ओवरहेड बहुत अधिक है। मैं cat file | process1 --out-file out1 --num-processes 2 | process2 --out-file out2
का उपयोग कर हल्के पाइप-फ़िल्टर डिज़ाइन पर बस गया हूं, जो पहले इनपुट के इनपुट का एक निश्चित प्रतिशत सीधे दूसरे इनपुट में पास करता है (this post देखें), लेकिन मैं पूरी तरह से पाइथन में एक समाधान रखना चाहता हूं।मल्टीप्रोसेसिंग के लिए पाइथन में बड़ी फ़ाइलों को विभाजित करने का सबसे अच्छा तरीका क्या है?
आश्चर्य की बात है कि पाइथन दस्तावेज ऐसा करने का एक वैधानिक तरीका सुझाता है (multiprocessing
दस्तावेज़ीकरण में प्रोग्रामिंग दिशानिर्देशों पर एक लंबे खंड के बावजूद)।
धन्यवाद, विन्स
अतिरिक्त जानकारी: प्रति पंक्ति संसाधित करने में समय बदलता रहता है। कुछ समस्याएं तेज और मुश्किल से I/O बाध्य नहीं हैं, कुछ CPU-bound हैं। सीपीयू बाध्य, गैर-निर्भर कार्यों को समांतरता से पोस्ट प्राप्त होगा, जैसे कि एक प्रसंस्करण समारोह में डेटा आवंटित करने के अक्षम तरीके भी दीवार घड़ी के समय के मामले में फायदेमंद होंगे।
एक प्रमुख उदाहरण एक ऐसी स्क्रिप्ट है जो रेखाओं से खेतों को निकालती है, विभिन्न प्रकार के बिटवॉ झंडे के लिए जांच करती है, और एक पूरी फाइल के साथ एक पूरी तरह से नए प्रारूप में कुछ झंडे वाली रेखाएं लिखती है। यह एक I/O बाध्य समस्या की तरह लगता है, लेकिन जब मैंने इसे अपने सस्ते समवर्ती संस्करण के साथ पाइप के साथ चलाया, तो यह लगभग 20% तेज था। जब मैं इसे पूल और मानचित्र के साथ चलाता हूं, या multiprocessing
में कतार यह हमेशा 100% से अधिक धीमी है।
यह अन्यथा डेन्डी स्क्रिप्टिंग भाषा के बारे में मेरा एक बड़ा हिस्सा है - सरल समवर्ती गणना धागे के बिना दर्द है । निश्चित रूप से, आप इसे पूरा कर सकते हैं, लेकिन कुछ नौकरियां थ्रेड-एंड-लॉक मॉडल के साथ बहुत ही सरल हैं। –
एक थ्रेडेड "समानांतर" संस्करण (मुझे विश्वास है) कभी भी तेज नहीं होगा, इस तथ्य को छोड़कर कि प्रक्रियाओं की तुलना में धागे तेजी से बना रहे हैं।जीआईएल सीपीयू-बाध्य बहुप्रचारित कार्यक्रमों के लिए एक बड़ी बाधा है। इसके अलावा, कोई म्यूटेबल ऑब्जेक्ट्स नहीं हैं जिन्हें प्रक्रियाओं/धागे के बीच साझा करने की आवश्यकता है, इसलिए मल्टीप्रोसेसिंग पर मल्टीथ्रेडिंग की वास्तव में आवश्यकता नहीं है। – Vince
@ वास्तव में, यह सभी सटीक परिस्थिति पर निर्भर करेगा। आपके में, यह कभी नहीं हो सकता है। दूसरों में, यह हो सकता है। मेरा मुद्दा यह है कि अधिकांश समवर्ती परिचालनों के लिए मुझे (सी में) करने की आवश्यकता है, थ्रेड और ताले एक बहुत ही सरल मॉडल देते समय उचित आईपीसी के लिए अतिरिक्त आवश्यक उपयोग करने के लिए शायद ही कभी औचित्य साबित हुआ है। बड़ी समस्याओं के लिए जिन्हें बेहतर और विभिन्न मशीनों में स्केल करने की आवश्यकता है, यह एक अलग कहानी है। –