संक्षेपफेरबदल समानांतर प्रक्रियाओं में विभिन्न अजगर वस्तुओं में क्रमश:
में मैं, समवर्ती जटिल अजगर वस्तुओं को बदलने के लिए जिससे प्रत्येक वस्तु के केवल एक ही प्रक्रिया द्वारा संसाधित किया जाता है चाहता हूँ। मैं यह कैसे कर सकता हूं (सबसे कुशलतापूर्वक)? कुछ प्रकार की पिकलिंग सहायता सहायता लागू करेगा? क्या वह कुशल होगा?
पूर्ण समस्या
मैं एक अजगर डेटा संरचना ArrayDict
कि मूल रूप से एक numpy
सरणी और एक शब्दकोश के होते हैं और सरणी में पंक्तियों को मनमाने ढंग से सूचकांक नक्शे की है। मेरे मामले में, सभी कुंजी पूर्णांक हैं।
a = ArrayDict()
a[1234] = 12.5
a[10] = 3
print(a[1234]) #12.5
print(a[10]) # 3.0
print(a[1234] == a.array[a.indexDict[1234]]) #true
अब मैं कई ऐसे ArrayDict
रों हैं और उन्हें myMethod(arrayDict, params)
में भरना चाहते हैं। चूंकि myMethod
महंगा है, इसलिए मैं इसे समानांतर में चलाने के लिए चाहता हूं। ध्यान दें कि myMethod
arrayDict
पर कई पंक्तियां जोड़ सकता है। प्रत्येक प्रक्रिया अपने ArrayDict
बदलती है। मुझे ArrayDict
एस के समवर्ती उपयोग की आवश्यकता नहीं है।
myMethod
में, मैं arrayDict
में प्रविष्टियों (अर्थात, मैं आंतरिक numpy
सरणी बदल), मैं arrayDict
के लिए प्रविष्टियां (अर्थात, मैं शब्दकोश में एक और सूचकांक जोड़ सकते हैं और आंतरिक में एक नया मान लिखने जोड़ने बदल सरणी)। आखिरकार, मैं बहुत कम हो जाने पर arrayDict
के आंतरिक numpy
सरणी का आदान-प्रदान करने में सक्षम होना चाहता हूं। यह अक्सर नहीं होता है और यदि कोई बेहतर समाधान मौजूद नहीं है, तो मैं अपने कार्यक्रम के गैर-समांतर हिस्से में यह क्रिया कर सकता हूं। मेरे स्वयं के प्रयास सरणी विनिमय के बिना भी सफल नहीं थे।
मैंने साझा स्मृति और पायथन के multiprocessing मॉड्यूल पर शोध करने के लिए दिन बिताए हैं। चूंकि मैं अंततः लिनक्स पर काम कर रहा हूं, यह कार्य अपेक्षाकृत सरल लग रहा था: सिस्टम कॉल fork()
कुशलतापूर्वक तर्कों की प्रतियों के साथ काम करने की अनुमति देता है। मेरा विचार तब प्रत्येक ArrayDict
को अपनी प्रक्रिया में बदलने के लिए था, ऑब्जेक्ट के परिवर्तित संस्करण को वापस कर दें, और मूल ऑब्जेक्ट को ओवरराइट करें। स्मृति को सहेजने और प्रतिलिपि बनाने के लिए काम को सहेजने के लिए, मैंने में डेटा स्टोर करने के लिए sharedmem सरणी के अतिरिक्त उपयोग किया। मुझे पता है कि शब्दकोश को अभी भी कॉपी किया जाना चाहिए।
from sharedmem import sharedmem
import numpy as np
n = ... # length of the data array
myData = np.empty(n, dtype=object)
myData[:] = [ArrayDict() for _ in range(n)]
done = False
while not done:
consideredData = ... # numpy boolean array of length
# n with True at the index of
# considered data
args = ... # numpy array containing arguments
# for myMethod
with sharedmem.MapReduce() as pool:
results = pool.map(myMethod,
list(zip(myData[considered],
args[considered])),
star=True)
myData[considered] = results
done = ... # depends on what happens in
# myMethod
क्या मैं एक विभाजन गलती त्रुटि है। मैं ArrayDict
से myMethod
की गहरी प्रतियां बनाकर और myData
में सहेजकर इस त्रुटि को बाधित करने में सक्षम था। मैं वास्तव में समझ में नहीं आता कि यह क्यों जरूरी है, और मेरे (संभावित रूप से बहुत बड़े) सरणी को प्रतिलिपि बनाना (जबकि लूप लंबे समय तक लेता है) ऐसा नहीं है जो मेरे लिए कुशल लगता है। हालांकि, कम से कम यह एक निश्चित हद तक काम किया। फिर भी, साझा प्रोग्राम के कारण तीसरे पुनरावृत्ति पर मेरे प्रोग्राम में कुछ छोटी गाड़ी का व्यवहार है। इसलिए, मुझे लगता है कि मेरा तरीका इष्टतम नहीं है।
मैंने here और here पढ़ा है कि multiprocessing.Array
का उपयोग करके साझा मेमोरी पर एब्रेट्री numpy arrays को सहेजना संभव है। हालांकि, मुझे अभी भी पूरे ArrayDict
को साझा करने की आवश्यकता होगी, जिसमें विशेष रूप से एक शब्दकोश शामिल है, जो बदले में नहीं है।
मैं अपने लक्ष्यों को एक कुशल तरीके से कैसे प्राप्त कर सकता हूं? क्या यह संभव है (और कुशल) मेरी वस्तु को किसी भी तरह से चुनने योग्य बनाना?
सभी समाधानों को पाइथन 3 और 64 बिट लिनक्स पर पूर्ण numpy/scipy समर्थन के साथ चलना चाहिए।
संपादित
मैं here पाया कि यह Multiprocessing "प्रबंधक" वर्गों और उपयोगकर्ता-निर्धारित प्रॉक्सी वर्गों का उपयोग मनमाने ढंग से वस्तुओं साझा करने के लिए किसी भी तरह संभव है। क्या यह कुशल होगा? मैं इसका फायदा उठाना चाहता हूं कि मुझे वस्तुओं की समवर्ती पहुंच की आवश्यकता नहीं है, भले ही उन्हें मुख्य प्रक्रिया में संभाला न जाए। क्या यह प्रत्येक ऑब्जेक्ट के लिए प्रबंधक बनाने का विकल्प होगा जिसे मैं संसाधित करना चाहता हूं? (मुझे अभी भी मैंगर्स कैसे काम करते हैं, इसके बारे में कुछ गलत धारणाएं हो सकती हैं।)
myMethod में arrayDict को आप कैसे संशोधित या उपयोग करते हैं? (मुझे लगता है कि आपका मतलब है 'myMethod'' myFunc' नहीं?) – gauteh
@ गौतहे: टाइपो के बारे में मुझे जागरूक करने के लिए धन्यवाद। मैंने इसे सही किया। मैंने myMethod में arrayDict को संशोधित करने का विवरण भी जोड़ा। – Samufi
क्या यह महत्वपूर्ण है कि ArrayDict मनमानी कुंजी प्रकार ले सकता है? अन्यथा वर्ग का उपयोग उन प्रकारों का उपयोग करने के लिए किया जा सकता है जिन्हें प्रबंधक के बिना प्रक्रियाओं में आसानी से साझा किया जा सकता है। जैसा कि अब है, एक प्रबंधक का उपयोग करना सबसे अच्छा विकल्प प्रतीत होता है क्योंकि समस्या कुछ जटिल है। प्रदर्शन हानि महत्वपूर्ण नहीं हो सकती है। – gauteh