2010-01-14 10 views
5

में स्टैक आकार को कैसे बढ़ा सकता हूं मेरे पास एक पाइथन प्रोग्राम है जो कस्टम-निर्मित DLL का उपयोग करता है। यह डीएलएल एक ढेर ओवरफ्लो के कारण दुर्घटनाग्रस्त हो जाता है। यह अतिप्रवाह एक पुनरावर्ती कार्य खराब होने के कारण नहीं है, लेकिन alloca() का उपयोग करके ढेर पर बड़े आवंटन के लिए है।मैं पाइथन

मैं इस त्रुटि से छुटकारा पाने के लिए स्टैक आकार को बढ़ाना चाहता हूं। क्या इसे करने का कोई तरीका है?

+0

आप स्रोत कोड बदल सकते हैं, तो http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

उत्तर

2

AFAIK एक प्रोग्राम केवल नए धागे या प्रक्रियाओं के स्टैक आकार को बदल सकता है (उदाहरण के लिए विंडोज़ CreateThread फ़ंक्शन)। पाइथन (और पायथन के लिए Win32 एपीआई) इस तरह की कार्यक्षमता का पर्दाफाश नहीं करता है, आपको ढेर मेमोरी के साथ स्टैक आवंटन को प्रतिस्थापित करना चाहिए। या स्टैक का उपयोग करने के लिए एक विशिष्ट कारण है ?? यदि alloca का उपयोग करने के लिए आप वास्तव में हैं तो आप DLL कोड (जो मुझे लगता है कि ओवरकिल है) के निष्पादन के लिए एक अलग थ्रेड बनाना चाहते हैं।

संपादित करें: सुधार - अजगर ढेर आकार सेट जब नए सूत्र बनाने के लिए (thread.stack_size देखें)

+0

स्तोत्र इंजन (DLL देखना जो समस्या का कारण बनता है) बड़े मैट्रिक्स कंप्यूशन को गति देने के लिए एलोका का उपयोग करता है। सौभाग्य से, यह एक संकलित ध्वज है जो मुझे इसके बजाय malloc पर स्विच करने देता है। यह थोड़ा धीमा है, लेकिन यह काम करता है। धन्यवाद! –

2

किसी डीएल में फ़ंक्शंस को निष्पादित होने पर उपलब्ध स्टैक आकार पर कोई नियंत्रण नहीं हो सकता है (जब तक कि आप अपनी लाइब्रेरी के नियंत्रण में नए धागे को नहीं निकालते)।

यदि डीएलएल कस्टम है, तो क्या आप ढेर के बजाय ढेर पर आवंटित नहीं कर सकते हैं (या स्थाई रूप से आवंटित, उचित होने पर), और इस तरह की समस्या को रोकें?

6

अजगर thread module आप नए सूत्र के लिए एक नया stack size निर्दिष्ट कर सकते हैं अनुमति मिल जाएगी। इसे उस मान पर सेट करने का प्रयास करें जो आपको लगता है कि यह काफी बड़ा है, और फिर इस डीएलएल के नए थ्रेड में काम कर रहा है।

2

जैसा कि कुछ संबंधित प्रश्नों में उल्लेख किया गया है like here, आम तौर पर रिकर्सन गहराई को बढ़ाने के लिए स्टैक आकार के साथ खेलने का अच्छा विचार नहीं है, लेकिन यहां कोड है जो दिखाता है कि उस प्रभाव को ढेर कैसे विकसित किया जाए। विंडोज 10 एक्स 64 सिस्टम पर अजगर 3.5 के साथ, यह एक बहुत ही गहरी रिकर्सन का प्रदर्शन करता है जो सामान्य रूप से असंभव है (मेरी स्थिति में सामान्य रूप से अनुमत रिकर्सन सीमा 993 प्रतीत होती है)। मुझे नहीं पता कि ढेर वास्तव में कितना बड़ा होना है, लेकिन नीचे निर्दिष्ट आकार के आधे हिस्से के साथ, अजगर दुर्घटनाग्रस्त हो जाता है।

import sys 
import threading 

class SomeCallable: 
    def __call__(self): 
     try: 
      self.recurse(99900) 
     except RecursionError: 
      print("Booh!") 
     else: 
      print("Hurray!") 
    def recurse(self, n): 
     if n > 0: 
      self.recurse(n-1) 

SomeCallable()() # recurse in current thread 

# recurse in greedy thread 
sys.setrecursionlimit(100000) 
threading.stack_size(0x2000000) 
t = threading.Thread(target=SomeCallable()) 
t.start() 
t.join() 

`

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