2013-11-04 4 views
6

में मल्टीप्रोसेसिंग में केवल पढ़ने के लिए स्पैर मैट्रिक्स साझा करने का एक प्रभावी तरीका है, मुझे कई समान प्रश्न मिलते हैं लेकिन कोई जवाब नहीं है। सरल सरणी के लिए 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 कर्मचारी वास्तव में काम कर रहे हैं। कारण यह है कि, मुझे लगता है कि प्रबंधक एक समय में केवल एक कार्यकर्ता डेटा तक पहुंचने की अनुमति देता है। चूंकि डेटा केवल पढ़ा जाता है, मुझे वास्तव में लॉक की आवश्यकता नहीं होती है। तो क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?

पेज, मैंने लोगों को कॉपी-ऑन-राइट फोर्क() के बारे में बात करते हुए देखा है। मैं वास्तव में समझ में नहीं आता कि यह क्या है लेकिन यह काम नहीं करता है। अगर मैं पहले उत्पन्न करता हूं और पूल() करता हूं, तो प्रत्येक प्रक्रिया में ए

की एक प्रति होगी, अग्रिम धन्यवाद।

+1

आप 'multmrocessing.Manager' के बजाय [sharedmem] (https://bitbucket.org/cleemesser/numpy-sharedmem/overview) का उपयोग करने का प्रयास करना चाहेंगे। जिज्ञासा से बाहर - आप किस ओएस का उपयोग कर रहे हैं? – unutbu

+0

@unutbu धन्यवाद। मैं sharemem पर एक नज़र डालने जा रहा हूँ। मैं इसे क्लस्टर – user2727768

उत्तर

0

नामस्थान ऑब्जेक्ट की एक संपत्ति केवल explicitly assigned to होने पर अपडेट की जाती है। अच्छी व्याख्या here दी गई है।

संपादित करें: और कार्यान्वयन को देखते हुए (multiprocessing/managers.py में), यह साझा स्मृति का उपयोग नहीं करता है। यह सिर्फ वस्तुओं को अचार करता है और अनुरोध करते समय उन्हें बच्चे को भेजता है। शायद यही कारण है कि यह इतना समय ले रहा है।

क्या आप किसी भी मौके से अपने सीपीयू के कोर के मुकाबले ज्यादा श्रमिकों के साथ पूल बना रहे हैं? (यानी processesPool कन्स्ट्रक्टर का तर्क का उपयोग कर।) यह आम तौर पर एक अच्छा विचार नहीं है।

कुछ अन्य चीजें हैं जो आप कोशिश कर सकते हैं;

  • फ़ाइल में स्पैर मैट्रिक्स लिखें, और प्रत्येक कार्यकर्ता को फ़ाइल को पढ़ने की प्रक्रिया दें। ओएस फाइल को अपने बफर कैश में रखेगा, इसलिए इसका प्रदर्शन आपके विचार से काफी बेहतर हो सकता है।
  • एमएमएपी मॉड्यूल का उपयोग कर मेमोरी मैप किए गए फ़ाइल का उपयोग करने के लिए एक संभावित सुधार है।
+0

पर लिनक्स वीएम पर चला रहा हूं धन्यवाद। कोर श्रमिकों की संख्या के बराबर हैं। क्या ऐसा इसलिए है क्योंकि सभी कर्मचारी एक ही समय में साझा मैट्रिक्स तक पहुंचने का प्रयास करते हैं और केवल एक ही पहुंच प्राप्त करता है? मुझे नहीं पता कि प्रबंधक के पास लॉक है या नहीं। शायद मुझे mmap कोशिश करनी चाहिए। – user2727768

+0

@ user2727768 अद्यतन उत्तर देखें। –

+0

जो समझ में आता है! धन्यवाद – user2727768