के साथ समांतरता मैं कुछ शोध कोड पर काम कर रहा हूं जो एक समारोह को अनुकूलित करने के लिए scipy.optimize.leastsq
का उपयोग करता है। यह प्रति पुनरावृत्ति के बारे में 18 गुना करता है, इसलिए मैं चलने वाले समय को कम करने के लिए समानांतर में leastsq को कॉल करना चाहता हूं। यह कोई समस्या नहीं होनी चाहिए क्योंकि अनुकूलन लगभग पूरी तरह अलग हैं इसलिए बहुत कम सिंक्रनाइज़ेशन आवश्यक है। मुझे हाल ही में multiprocessing.pool.ThreadPool
पता चला है जो मुझे साझा स्मृति को स्पष्ट रूप से स्थापित किए बिना ऐसा करने की अनुमति देगा (एक दर्द क्योंकि मेरे अधिकांश डेटा NumPy arrays में हैं)। इसलिए मैंने अपने कोड का थोड़ा सा पुनर्लेखन किया, उम्मीद है कि यह काम करेगा, लेकिन यह एक अजीब त्रुटि फेंकता है: SystemError: null argument to internal routine
।SciPy.optimize
def optfunc(id):
def errfunc(x):
return somedata[id] - somefunc(x)
lock.acquire()
x0 = numpy.copy(currentx[id])
lock.release()
result = scipy.optimize.leastsq(errfunc, x0)
lock.acquire()
currentx[id] = result
lock.release()
ThreadPool(processes=8).map(optfunc, range(idcount))
यह ठीक काम करना चाहिए, जब तक कि scipy.optimize.leastsq
threadsafe नहीं है:
के बाद मेरे कोड का एक सरलीकरण है। तो मैंने scipy.optimize.leastsq
के आसपास एक ताला लगाने की कोशिश की; लो और देखो यह काम करता है। हालांकि, प्रोसेसर उपयोग 100% पर अटक गया है, इसलिए यह मेरे लिए बेकार है।
मेरा प्रश्न है तो मैं इसके बारे में क्या कर सकता हूं? मुझे लगता है कि मेरी विकल्प हैं:
- एल एम के एक धागा सुरक्षित कार्यान्वयन का पता लगाएं
- धागे प्रक्रियाओं के बजाय का उपयोग करके देखें (मुझे नहीं लगता कि यह एक फर्क होता है)
किसी भी मदद या सुझाव की सराहना की जाएगी।
क्या आप विंडोज का उपयोग कर रहे हैं? विंडोज़ पर optimize.leastsq में थ्रेडिंग के साथ एक ज्ञात समस्या है: http://projects.scipy.org/scipy/ticket/1117। –
हम्म, दिलचस्प है कि जब मैंने खोज की तो नहीं आया। मैं उबंटू का उपयोग कर रहा हूं लेकिन शायद यह दोनों ऑपरेटिंग सिस्टम को प्रभावित करता है। – Steve