में मल्टीप्रोसेसिंग में केवल पढ़ने के लिए स्पैर मैट्रिक्स साझा करने का एक प्रभावी तरीका है, मुझे कई समान प्रश्न मिलते हैं लेकिन कोई जवाब नहीं है। सरल सरणी के लिए multiprocessing.Array है। स्पैर मैट्रिक्स या किसी अन्य मनमानी ऑब्जेक्ट के लिए मुझे प्रबंधक.नामस्पेस मिलती है। तो मैंने नीचे दिए गए कोड को आजमाया:पाइथन
from scipy import sparse
from multiprocessing import Pool
import multiprocessing
import functools
def myfunc(x,ns):
return ns.A[x,:]*ns.A*ns.A[:,x]
manager = multiprocessing.Manager()
Global = manager.Namespace()
pool=Pool()
Global.A=sparse.rand(10000,10000,0.5,'csr')
myfunc2=functools.partial(myfunc,ns=Global)
r=pool.map(myfunc2, range(100))
कोड काम करता है लेकिन कुशल नहीं है। वास्तव में 16 में से 4 कर्मचारी वास्तव में काम कर रहे हैं। कारण यह है कि, मुझे लगता है कि प्रबंधक एक समय में केवल एक कार्यकर्ता डेटा तक पहुंचने की अनुमति देता है। चूंकि डेटा केवल पढ़ा जाता है, मुझे वास्तव में लॉक की आवश्यकता नहीं होती है। तो क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?
पेज, मैंने लोगों को कॉपी-ऑन-राइट फोर्क() के बारे में बात करते हुए देखा है। मैं वास्तव में समझ में नहीं आता कि यह क्या है लेकिन यह काम नहीं करता है। अगर मैं पहले उत्पन्न करता हूं और पूल() करता हूं, तो प्रत्येक प्रक्रिया में ए
की एक प्रति होगी, अग्रिम धन्यवाद।
आप 'multmrocessing.Manager' के बजाय [sharedmem] (https://bitbucket.org/cleemesser/numpy-sharedmem/overview) का उपयोग करने का प्रयास करना चाहेंगे। जिज्ञासा से बाहर - आप किस ओएस का उपयोग कर रहे हैं? – unutbu
@unutbu धन्यवाद। मैं sharemem पर एक नज़र डालने जा रहा हूँ। मैं इसे क्लस्टर – user2727768