के साथ मल्टीप्रोसेसिंग मैं कुछ भारी गणनाओं के समानांतर करने के लिए multiprocessing.Pool()
का उपयोग कर रहा हूं।बड़े डेटा
लक्ष्य फ़ंक्शन बहुत सारे डेटा (एक विशाल सूची) देता है। मैं राम से बाहर चला रहा हूँ।
multiprocessing
के बिना, मैं केवल yield
द्वारा परिणामस्वरूप तत्वों को एक जनरेटर में बदलता हूं, जैसा कि उनकी गणना की जाती है।
मुझे लगता है कि मल्टीप्रोसेसिंग जेनरेटर का समर्थन नहीं करता है - यह पूरे आउटपुट की प्रतीक्षा करता है और इसे एक बार में देता है, है ना? कोई उपज नहीं। क्या Pool
श्रमिकों को राम में संपूर्ण परिणाम सरणी के निर्माण के बिना, जैसे ही वे उपलब्ध हो जाते हैं, डेटा उत्पन्न करने का कोई तरीका है?
सरल उदाहरण:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
यह अजगर 2.7 है।
कतार मसालेदार डेटा पास करेगी। तो डेटा -> अचार-> अनपिक-> डेटा की नई प्रति। यह कार्यक्रम को धीमा कर देगा और अधिक अतिरिक्त रैम का उपयोग करेगा। इसके बजाय साझा स्मृति का उपयोग करने पर विचार करना चाहिए। – Wang