2012-02-16 13 views
5

मैं पेज से एक वेबसाइट पृष्ठ से कुछ जानकारी स्क्रैप करने का प्रयास कर रहा था के साथ "बाहर स्मृति" त्रुटि, मूल रूप से यहाँ मैं क्या किया है:मशीनीकरण

import mechanize 
MechBrowser = mechanize.Browser() 

Counter = 0 

while Counter < 5000: 
    Response = MechBrowser.open("http://example.com/page" + str(Counter)) 
    Html = Response.read() 
    Response.close() 

    OutputFile = open("Output.txt", "a") 
    OutputFile.write(Html) 
    OutputFile.close() 

    Counter = Counter + 1 

खैर, इसके बाद के संस्करण कोड "बाहर फेंकने से समाप्त हो गया मेमोरी "त्रुटि और कार्य प्रबंधक में यह दिखाता है कि कई घंटे चलने के बाद स्क्रिप्ट लगभग 1 जीबी मेमोरी का उपयोग करती है ... कैसे आती है ?!

क्या कोई मुझे बताएगा कि क्या गलत हुआ?

+2

पहली चीज जिसे मैं रद्द करने का प्रयास करता हूं वह यह है कि मशीनीकरण स्मृति को लीक कर रहा है - बस इसके बजाय 'urllib2.urlopen() 'का उपयोग करें। –

+3

बस एक नोट के रूप में, काउंटर रेंज (5000) के लिए '' 'करने के लिए यह अधिक पाइथोनिक है:' '। और पीईपी 8 परिवर्तनीय नामों के लिए low_case_with_underscores की सिफारिश करता है, जबकि CamelCase कक्षाओं के लिए आरक्षित है। साथ ही, फाइलों से/लिखने/पढ़ने के लिए '' '' के साथ जांचें। –

+2

(ए) इस प्रकार का "मेरे कोड के साथ क्या है" प्रश्न कोडरेव्यू (बी) परिवर्तनीय पुन: उपयोग पर बेहतर है क्योंकि समस्या नहीं है (सी) स्मृति प्रोफाइलिंग के बारे में जानें। – Marcin

उत्तर

13

यह वास्तव में एक स्मृति रिसाव नहीं है, बल्कि एक अनियंत्रित सुविधा है। असल में, mechanize.Browser() सामूहिक रूप से स्मृति में सभी ब्राउज़र इतिहास संग्रहीत कर रहा है।

यदि आप Response.close() के बाद MechBrowser.clear_history() पर कॉल जोड़ते हैं, तो इसे समस्या का समाधान करना चाहिए।

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