मेरे पास एक सुस्त सरणी है जिसे मैं पाइथन प्रक्रियाओं के समूह के बीच साझा करना चाहता हूं जिसमें प्रतियां शामिल नहीं हैं। मैं sharedmem पैकेज का उपयोग कर मौजूदा numpy सरणी से एक साझा numpy सरणी बनाते हैं।साझा गैर-संगत-पहुंच नम्पी ऐरे
import sharedmem as shm
def convert_to_shared_array(A):
shared_array = shm.shared_empty(A.shape, A.dtype, order="C")
shared_array[...] = A
return shared_array
मेरी समस्या यह है कि प्रत्येक उपप्रोसेसर को उन पंक्तियों तक पहुंचने की आवश्यकता होती है जो सरणी में यादृच्छिक रूप से वितरित होते हैं। वर्तमान में मैं साझा किए गए पैकेज का उपयोग करके एक साझा numpy सरणी बनाते हैं और इसे प्रत्येक उपप्रोसेसर में पास करता हूं। प्रत्येक प्रक्रिया में पंक्तियों की एक सूची, आईडीएक्स भी होती है जिसे इसे एक्सेस करने की आवश्यकता होती है।
#idx = list of randomly distributed integers
local_array = shared_array[idx,:]
# Do stuff with local array
यह सिर्फ एक और दृश्य के बजाय सरणी की एक प्रतिलिपि बनाता है: समस्या उपप्रक्रिया जब मैं क्या कर रही है। सरणी काफी बड़े हैं और इतना है कि प्रत्येक प्रक्रिया की तरह
local_array = shared_array[start:stop,:]
बहुत समय लगता है पंक्तियों की एक सन्निहित सीमा तक पहुँचता है यह shareing करने से पहले उसे जोड़ तोड़ है।
प्रश्न: पाइथन प्रक्रियाओं के बीच एक numpy सरणी में यादृच्छिक पहुंच साझा करने के लिए अच्छे समाधान क्या हैं जिनमें सरणी की प्रतिलिपि शामिल नहीं है?
उपप्रोसेसरों को केवल पढ़ने की आवश्यकता है (इसलिए एक्सेस पर लॉक करने की कोई आवश्यकता नहीं है)।
जो भी इसके लायक है, उसके पास साझा स्मृति होने के साथ इसका कोई लेना-देना नहीं है। गंदे सरणी को स्मृति में संगत होना चाहिए, इसलिए कोई फैंसी इंडेक्सिंग (उदा। इंडस्ट्रीज की सरणी के साथ अनुक्रमण) हमेशा एक प्रतिलिपि देता है। यह किसी भी numpy सरणी के लिए सच है। या तो स्लाइस के बजाए, इंडस्ट्रीज के छोटे हिस्सों या पुनरावृत्तियों के साथ काम करें। –
@ जोकिंगटन - आप सही हैं। समस्या सामान्य रूप से numpy arrays के साथ है। –