2012-07-01 12 views
18
Traceback (most recent call last): 
File "/run-1341144766-1067082874/solution.py", line 27, in 
main() 
File "/run-1341144766-1067082874/solution.py", line 11, in main 
if len(s[i:j+1]) > 0: 
MemoryError 
Error in sys.excepthook: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook 
from apport.fileutils import likely_packaged, get_recent_crashes 
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report 
MemoryError 

Original exception was: 
Traceback (most recent call last): 
File "/run-1341144766-1067082874/solution.py", line 27, in 
main() 
File "/run-1341144766-1067082874/solution.py", line 11, in main 
if len(s[i:j+1]) > 0: 
MemoryError 

उपरोक्त त्रुटियां तब दिखाई दी जब मैंने निम्न प्रोग्राम चलाने की कोशिश की। क्या कोई समझ सकता है कि स्मृति त्रुटि क्या है, और इस समस्या को कैसे दूर किया जाए? । कार्यक्रम इनपुट के रूप में स्ट्रिंग लेता है और सभी संभावित उप स्ट्रिंग्स पाता है और इसमें से एक सेट (लेक्सिकोग्राफ़िकल ऑर्डर में) बनाता है और इसे उपयोगकर्ता द्वारा पूछे जाने वाले संबंधित इंडेक्स पर मूल्य प्रिंट करना चाहिए अन्यथा इसे 'अमान्य'पायथन में स्मृति त्रुटि

प्रिंट करना चाहिए
def main(): 
    no_str = int(raw_input()) 
    sub_strings= [] 
    for k in xrange(0,no_str): 
     s = raw_input() 
     a=len(s) 
     for i in xrange(0, a): 
      for j in xrange(0, a): 
       if j >= i: 
        if len(s[i:j+1]) > 0: 
         sub_strings.append(s[i:j+1]) 
    sub_strings = list(set(sub_strings)) 
    sub_strings.sort() 
    queries= int(raw_input()) 
    resul = [] 
    for i in xrange(0,queries): 
     resul.append(int(raw_input())) 
    for p in resul: 
     try: 
      print sub_strings[p-1] 
     except IndexError: 
      print 'INVALID' 


if __name__ == "__main__": 
    main() 
+5

आप स्मृति से बाहर हैं: http://docs.python.org/library/exceptions.html – usoban

+1

मुझे लगता है कि आप स्मृति से बाहर हो रहे हैं, क्या आप अपना इनपुट डेटा पोस्ट कर सकते हैं? –

+0

आप क्या करने की कोशिश कर रहे हैं? – robert

उत्तर

12

यह यहाँ एक:

s = raw_input() 
a=len(s) 
for i in xrange(0, a): 
    for j in xrange(0, a): 
     if j >= i: 
      if len(s[i:j+1]) > 0: 
       sub_strings.append(s[i:j+1]) 

बहुत अक्षम और बड़े स्ट्रिंग्स के लिए महंगा हो रहा है।

बेहतर

for i in xrange(0, a): 
    for j in xrange(i, a): # ensures that j >= i, no test required 
     part = buffer(s, i, j+1-i) # don't duplicate data 
     if len(part) > 0: 
      sub_Strings.append(part) 

एक बफर वस्तु मूल स्ट्रिंग के लिए एक संदर्भ रखता है और शुरू होता है और लंबाई गुण है। इस तरह, डेटा का कोई अनावश्यक डुप्लिकेशन नहीं होता है। तो स्मृति की खपत लगभग l*l*l/4 होगा

लंबाई l की एक स्ट्रिंग

, औसत लंबाई l/2 की l*l/2 उप तार है। एक बफर के साथ, यह बहुत छोटा है।

ध्यान दें कि buffer() केवल 2. x में मौजूद है 3.x में memoryview() है, जिसका उपयोग थोड़ा अलग है।

इंडेक्स की गणना करना और मांग पर सबस्ट्रिंग को काटना बेहतर होगा।

5

memory error का अर्थ है कि आपका प्रोग्राम स्मृति से बाहर हो गया है। इसका मतलब है कि आपका प्रोग्राम किसी भी तरह से बहुत सारी वस्तुओं को बनाता है।

अपने उदाहरण में, आप अपने एल्गोरिथ्म के कुछ हिस्सों कि स्मृति का एक बहुत लेने जा सकता है देखने के लिए है। मुझे संदेह है कि आपके कार्यक्रम को इनपुट के रूप में बहुत लंबा तार दिया जाता है। इसलिए, s[i:j+1] अपराधी हो सकता है, क्योंकि यह एक नई सूची बनाता है। पहली बार जब आप इसका इस्तेमाल करते हैं, तो यह आवश्यक नहीं है क्योंकि आप बनाई गई सूची का उपयोग नहीं करते हैं। यदि निम्नलिखित में मदद करता है देखने के लिए कोशिश कर सकते:

if j + 1 < a: 
    sub_strings.append(s[i:j+1]) 

दूसरी सूची निर्माण बदलने के लिए, आप निश्चित रूप से के रूप में glglgl ने सुझाव दिया, एक buffer वस्तु का उपयोग करना चाहिए।

भी ध्यान रखें कि जब से तुम if j >= i: उपयोग करते हैं, आप शुरू करने के लिए की जरूरत नहीं है अपने xrange 0. में आप कर सकते हैं:

for i in xrange(0, a): 
    for j in xrange(i, a): 
     # No need for if j >= i 

एक अधिक कट्टरपंथी विकल्प अपने एल्गोरिथ्म rework करने के लिए प्रयास करने के लिए किया जाएगा, ताकि आप सभी संभावित उप-तारों की पूर्व-गणना न करें। इसके बजाए, आप बस पूछे जाने वाले सबस्ट्रिंग की गणना कर सकते हैं।

+1

से पहले मेरा पूरा स्पष्टीकरण देखें, मुझे पहले से ही पता है कि, इस मामले में यह क्यों हो रहा है पर थोड़ा और स्पष्टीकरण होगा । –

+2

मैं बस आपके प्रश्न के शीर्षक को स्पष्ट उत्तर देने की कोशिश कर रहा था, अगर किसी और को यह 'मेमोरी एरर' और पायथन की तलाश में मिलता है। – Rodrigue

+0

@kratos आपने इसके लिए पूछा: "क्या कोई बता सकता है कि स्मृति त्रुटि क्या है," – glglgl

0

आप उसी स्क्रिप्ट को बनाने का प्रयास कर सकते हैं जो उस त्रुटि को पॉपअप करता है, स्क्रिप्ट को बाहरी स्क्रिप्ट से आयात करके कई स्क्रिप्ट में विभाजित करता है। उदाहरण, hello.py एक त्रुटि मेमोरी त्रुटि की उम्मीद है, इसलिए मैं कई स्क्रिप्ट में hello.py को विभाजित करता हूं h.py e.py ll.py.py उन सभी को उस फ़ोल्डर में "हैलोहेलो" फ़ोल्डर में जाना होगा init।init लिखने में आयात एच, ई, ll, ओ और फिर विचार पर आप आयात हैलोहेलो

1

पायथन 64 बिट का उपयोग बहुत सारी समस्याएं हल करता है।

+5

शायद यह अन्य उपयोगकर्ताओं के लिए उपयोगी होगा कि यह समस्याएं हल क्यों करती है? – DeadChex

7

यदि आपको एक अप्रत्याशित MemoryError मिलता है और आपको लगता है कि आपके पास बहुत सी रैम उपलब्ध होनी चाहिए, तो ऐसा इसलिए हो सकता है क्योंकि आप 32-बिट पायथन स्थापना का उपयोग कर रहे हैं।

यदि आपके पास 64-बिट ऑपरेटिंग सिस्टम है, तो आसान समाधान, पाइथन की 64-बिट स्थापना पर स्विच करना है।

मुद्दा यह है कि 32-बिट पायथन के पास केवल 4 जीबी रैम तक पहुंच है। यदि ऑपरेटिंग सिस्टम ओवरहेड की वजह से आपका ऑपरेटिंग सिस्टम 32-बिट है तो यह और भी कम हो सकता है।

आप क्यों 32-बिट ऑपरेटिंग सिस्टम रैम यहाँ की ~ 4GB तक ही सीमित हैं के बारे में अधिक सीख सकते हैं: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

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