मान लीजिए कि मेरे पास मेमोरी सुपीरियर सरणी में एक बड़ा है, मेरे पास एक फ़ंक्शन है func
जो इनपुट के रूप में इस विशाल सरणी में लेता है (कुछ अन्य मापदंडों के साथ)। func
विभिन्न मापदंडों के साथ समानांतर में चलाया जा सकता है। उदाहरण के लिए:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
यदि मैं मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करता हूं, तो उस विशाल सरणी को कई बार विभिन्न प्रक्रियाओं में कॉपी किया जाएगा।
क्या विभिन्न प्रक्रियाओं को एक ही सरणी को साझा करने का एक तरीका है? यह सरणी ऑब्जेक्ट केवल-पढ़ने के लिए है और इसे कभी भी संशोधित नहीं किया जाएगा।
क्या अधिक जटिल है, अगर गिरफ्तारी एक सरणी नहीं है, लेकिन एक मनमाना अजगर वस्तु है, क्या इसे साझा करने का कोई तरीका है?
[संपादित]
मैंने जवाब पढ़ा लेकिन मैं अभी भी थोड़ा उलझन में हूं। चूंकि कांटा () कॉपी-ऑन-राइट है, इसलिए हमें अजगर मल्टीप्रोसेसिंग लाइब्रेरी में नई प्रक्रियाओं को शुरू करते समय किसी भी अतिरिक्त लागत का आह्वान नहीं करना चाहिए। लेकिन निम्नलिखित कोड से पता चलता है कि एक बहुत बड़ा ओवरहेड है:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
आउटपुट (और वैसे, लागत बढ़ जाती है क्योंकि सरणी का आकार बढ़ जाता है, इसलिए मुझे संदेह है कि मेमोरी मेमोरी से संबंधित ओवरहेड अभी भी है):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
अगर हम सरणी की नकल नहीं करते हैं, तो इतना बड़ा ओवरहेड क्यों है? और साझा स्मृति मुझे किस हिस्से को बचाती है?