मैं कुछ प्रदर्शन प्राप्त करने के लिए पाइथन की मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। विशेष रूप से मैं इसका map फ़ंक्शन का उपयोग कर रहा हूं। अब, किसी कारण से जब मैं इसे अपने एकल संसाधित समकक्ष के साथ बदल देता हूं तो मुझे उच्च स्मृति उपयोग नहीं मिलता है। लेकिन मानचित्र के मल्टीप्रोसेसिंग संस्करण का उपयोग करके मेरी याददाश्त छत के माध्यम से जाती है। रिकॉर्ड के लिए मैं कुछ ऐसा कर रहा हूं जो आसानी से स्मृति के भार को कम कर सकता है, लेकिन दोनों के बीच अंतर इतना अंतर पैदा करने के लिए क्या होगा?हाई मेमोरी उपयोग केवल तभी जब मल्टीप्रोसेसिंग
उत्तर
आपको एहसास है कि मल्टीप्रोसेसिंग धागे का उपयोग नहीं करता है, हां? मैं यह इसलिए कहता हूं क्योंकि आप "सिंगल थ्रेडेड समकक्ष" का जिक्र करते हैं।
क्या आप multiprocessing
के map
के माध्यम से बहुत अधिक डेटा भेज रहे हैं? एक संभावित कारण है कि कई मामलों में धारावाहिक मल्टीप्रोसेसिंग करना है। multiprocessing
pickle
का उपयोग करता है, जो आम तौर पर इसे उठाए जाने वाले डेटा की तुलना में अधिक स्मृति लेता है। (कुछ मामलों में, विशेष रूप से fork()
साथ सिस्टम जहां नई प्रक्रियाओं बनाई गई हैं जब आप map
विधि कॉल, यह क्रमबद्धता से बच सकते हैं, लेकिन जब भी यह मौजूदा प्रक्रिया यह ऐसा नहीं कर सकते करने के लिए नए डेटा भेजने के लिए की जरूरत है पर।)
के बाद से multiprocessing
के साथ सभी वास्तविक कार्य अलग-अलग प्रक्रियाओं में किए जाते हैं, आपके मुख्य प्रक्रिया की स्मृति आपके द्वारा किए जाने वाले वास्तविक संचालन से प्रभावित नहीं होनी चाहिए। स्मृति का कुल उपयोग काफी हद तक बढ़ता है, हालांकि, प्रत्येक कार्यकर्ता की प्रक्रिया में आपके द्वारा भेजे गए डेटा की एक प्रति होती है। यह कभी-कभी कॉपी-ऑन-राइट मेमोरी (उसी मामले में सीरियलाइजिंग के रूप में नहीं) है जिनके पास CoW है, लेकिन पाइथन का स्मृति का उपयोग ऐसा है कि यह जल्दी से लिखा जाता है, और इस प्रकार कॉपी किया जाता है।
ठीक है, इसके बारे में खेद है कि मुझे पता है कि मल्टीप्रोसेस वास्तव में धागे का उपयोग नहीं करता है। (इसलिए नाम) तो पाइप पर जानकारी भेजना यह है कि इसे क्या मार रहा है। बहुत सारी समझ में आता है। क्या आप जिस समस्या का सामना कर रहे हैं, उसके समाधान के बारे में आप जानते हैं? – Sandro
कम डेटा पर भेजें। या, इसे छोटे हिस्सों में भेज दें। या, यदि आप कांटा() के साथ सिस्टम पर हैं, तो इसे करें ताकि क्रमबद्धता न हो: सुनिश्चित करें कि मल्टीप्रोसेसिंग नई प्रक्रियाएं शुरू करेगी। –
रिकॉर्ड के लिए, यह स्मृति * रिसाव * की तरह नहीं है, बस स्मृति * उपयोग * की तरह। –
बहुत सच है, एक बार फिर, मेरे हिस्से पर बुरा शब्द। – Sandro