7

की तुलना में है मैं वस्तुओं स्टोर करने के लिए एक dict है इस निर्देश को आम प्रक्रियाओं को साझा करेंअजगर manager.dict() बहुत धीमी गति से नियमित dict

mgr = multiprocessing.Manager() 
jobs = mgr.dict() 
job = Job() 
jobs[job.name] = job 

बस प्रबंधक.dict() चीजों का उपयोग करने के लिए कनवर्ट करके चीजें बहुत धीमी हो गईं।

उदाहरण के लिए, यदि मूल निर्देश का उपयोग किया जाता है, तो इसमें केवल 625 ऑब्जेक्ट बनाने के लिए .65 सेकंड लेते हैं और इसे निर्देश में संग्रहीत करते हैं।

एक ही कार्य में अब 126 सेकंड लगते हैं!

कोई भी अनुकूलन मैं प्रबंधक.dict() को python {} के बराबर रखने के लिए कर सकता हूं?

उत्तर

6

समस्या यह है कि प्रत्येक डालने किसी कारण (मेरी मशीन पर 117x धीमी) के लिए काफी धीमी है, लेकिन अगर आप एक सामान्य dict के साथ अपने manager.dict() अद्यतन करते हैं, यह एक एकल और तेजी से ऑपरेशन किया जाएगा।

jobs = {} 
job = Job() 
jobs[job.name] = job 
# insert other jobs in the normal dictionary 

mgr = multiprocessing.Manager() 
mgr_jobs = mgr.dict() 
mgr_jobs.update(jobs) 

फिर mgr_jobs चर का उपयोग करें।

एक और विकल्प व्यापक रूप से अपनाया गया multiprocessing.Queue वर्ग का उपयोग करना है।

+0

जैसे लूप के बाहर अपने mgr.dict() को अपडेट कर सकते हैं, इससे शुरुआती निर्माण में देरी हो जाएगी। लेकिन अगर मुझे कई बार डालने/हटाने की ज़रूरत है तो क्या होगा? किसी भी विचार को नियमित निर्देश की तुलना में manager.dict() के लिए लुकअप कैसे करता है? – ealeon

+0

ऐसा लगता है कि प्रबंधक के लिए सम्मिलन भयानक है। क्यूयू() भी। किसी भी विचार से नियमित निर्देश की तुलना में manager.dict() के लिए लुकअप और हटाना कैसे कार्य करता है? – ealeon

+1

@ealeon 'multiprocessing.Queue' (प्रबंधक नहीं) के बारे में क्या? – JBernardo

0

यदि आप अपने पूल में एक लूप के अंदर mgr.dict() का उपयोग कर रहे हैं। आप परिणामों को अस्थायी रूप से स्टोर करने के लिए स्थानीय सामान्य निर्देश का उपयोग कर सकते हैं और फिर

संबंधित मुद्दे