2012-04-05 21 views
49

मैं पाइथन में कोसारजु के मजबूत कनेक्टेड घटक (एससीसी) ग्राफ खोज एल्गोरिदम को कार्यान्वित कर रहा हूं।पाइथन सेगमेंटेशन गलती का क्या कारण बनता है?

प्रोग्राम छोटे डेटा सेट पर बहुत अच्छा चलता है, लेकिन जब मैं इसे एक सुपर-बड़े ग्राफ (800,000 से अधिक नोड्स) पर चलाता हूं, तो यह "सेगमेंटेशन फॉल्ट" कहता है।

इसका कारण क्या हो सकता है? धन्यवाद!


अतिरिक्त जानकारी: सबसे पहले मैं जब सुपर बड़े डेटा सेट पर चल रहा है यह त्रुटि आई:

"RuntimeError: maximum recursion depth exceeded in cmp" 

तब मैं

sys.setrecursionlimit(50000) 

का उपयोग कर प्रत्यावर्तन सीमा रीसेट लेकिन एक मिल गया 'सेगमेंटेशन गलती'

मेरा मानना ​​है कि यह एक अनंत लूप नहीं है, यह चलता है अपेक्षाकृत छोटे डेटा पर सही है। यह संभव है कि कार्यक्रम ने संसाधनों को समाप्त कर दिया?

+9

हो सकता है आप एक बार देख [CrashingPython] हो सकता है (http://wiki.python.org/moin/CrashingPython) – Abhijit

+2

इस है शुद्ध पायथन में चल रहे हैं या आप सी एक्सटेंशन मॉड्यूल का उपयोग कर रहे हैं? यदि यह शुद्ध पायथन है तो यह वहां एक बग है और बधाई हो। यदि आप एक सी मॉड्यूल का उपयोग कर रहे हैं, तो segfault शायद वहां से आ रहा है। – aaronasterling

+0

यह शुद्ध पायथन है। कार्यक्रम अपेक्षाकृत छोटे डेटा सेट पर बहुत अच्छा चलता है और इससे मुझे लगता है कि कोड सही है। – xiaolong

उत्तर

54

ऐसा तब होता है जब एक अजगर एक्सटेंशन (सी में लिखा गया) पहुंच से परे स्मृति तक पहुंचने का प्रयास करता है।

आप इसे निम्न तरीकों से ढूंढ सकते हैं।

  • कोड की पहली पंक्ति पर sys.settrace जोड़ें।
  • उपयोग gdb के रूप में कमांड प्रॉम्प्ट पर this answer .. में द्वारा वर्णित मार्क

    gdb python 
    (gdb) run /path/to/script.py 
    ## wait for segfault ## 
    (gdb) backtrace 
    ## stack trace of the c code 
    
+2

धन्यवाद, लेकिन मेरा कोड शुद्ध पायथन है, क्या इससे कोई फर्क पड़ता है? – xiaolong

+0

जांचें कि आप कौन से पायथन मॉड्यूल का उपयोग कर रहे हैं? कुछ मॉड्यूल पायथन में लिखे गए हैं और अन्य सी में हैं। मुझे लगता है कि आपको एक बग की रिपोर्ट करने की आवश्यकता है। –

+0

समान, सहायक भी: stdlib's [trace] (http://pymotw.com/2/trace/) मॉड्यूल ने मुझे एक स्टेजिंग सर्वर पर एक सेगमेंटेशन गलती के नीचे पहुंचने में मदद की, बिना किसी नई निर्भरता को स्थापित किए, और संशोधित किए बिना कोड। ओएसएक्स सिएरा पर – hangtwenty

34

मैं समझता हूँ कि आपकी समस्या का समाधान कर लिया है, लेकिन यह धागा पढ़ने दूसरों के लिए, यहाँ जवाब है : आपको उस स्टैक को बढ़ाना होगा जो आपके ऑपरेटिंग सिस्टम को अजगर प्रक्रिया के लिए आवंटित करता है।

ऐसा करने का तरीका ऑपरेटिंग सिस्टम निर्भर है। लिनक्स में, आप कमांड के साथ ulimit -s अपने वर्तमान मूल्य की जांच कर सकते हैं और आप पिछले मान दोहरीकरण के साथ ulimit -s <new_value>

कोशिश यह बढ़ाने के लिए और अगर यह काम नहीं करता दोहरीकरण जारी रख सकते हैं, जब तक आप एक मिल नहीं जाता या स्मृति से बाहर चलाने के।

+0

द्वारा प्रतिस्थापित किया गया था यह जांचने का एक अच्छा तरीका है कि आप उलिमिट अधिकतम के खिलाफ आ रहे हैं या नहीं, 'lsof' चलाने के लिए और सब कुछ ट्रैक रखने के लिए' grep' या'wc -l' का उपयोग करना है। – cdated

+0

मैं सहमत हूं। यह वास्तव में पाइथन और सी ++ कार्यान्वयन दोनों पर सेगफॉल्ट को ठीक करके मेरे कोसारजु के एससीसी कार्यान्वयन के लिए काम करता था।
मेरे मैक के लिए, मुझे अधिकतम अधिकतम पता चला: – Rock

+2

ध्यान दें कि ulimit मान केवल उस विशेष खोल के लिए संशोधित किया जाता है जिसमें इसे निष्पादित किया जाता है, ताकि आप गलती से अपने पूरे सिस्टम के मूल्य को संशोधित न करें –

8

विभाजन गलती, सामान्य से एक है वहाँ इस

  • कम स्मृति
  • दोषपूर्ण राम स्मृति
  • विशाल डेटा से सेट लाई जा रही है क्वेरी का उपयोग डाटाबेस (लाए जाने के डेटा का आकार की तुलना में अधिक है के लिए कई संभावित कारण हैं स्वैप मेम)
  • गलत जानकारी/बग्गी कोड
  • होने लंबे पाश (कई प्रत्यावर्तन)
0

अल्मिमित को अपने कोसारजु के एससीसी कार्यान्वयन के लिए दोनों पायथन (पायथन सीगफॉल्ट .. जो जानता था!) ​​और सी ++ कार्यान्वयन पर segfault को ठीक करके काम किया।

मेरी मैक के लिए, मैं के माध्यम से संभव अधिकतम पता चला:

$ ulimit -s -H 
65532 
संबंधित मुद्दे