2013-07-11 18 views
5

से एक बाइट पढ़ें मेरे पास यह फ़ंक्शन है कि मैं एक बड़ी फ़ाइल से एक बाइट पढ़ना चाहता हूं। एकमात्र समस्या यह है कि फ़ाइल की एक निश्चित राशि के बाद पीसी पर मेमोरी एक स्थिर 1.5 जीबी से 4 जीबी तक और ऊपर की ओर बढ़ती है, इस पर निर्भर करता है कि कितनी फाइल पढ़ती है। (मैं 80 फाइलों में तोड़ता हूं क्योंकि उच्चतर मेरे पीसी को दुर्घटनाग्रस्त कर देगा)बड़ी फ़ाइल

मैं चाहता हूं कि 1 बाइट प्राप्त करें और पूरी फाइल न हो। कृपया मदद करें।

def mem_test(): 
     count = 0 
     for dirpath, dnames, fnames in scandir.walk(restorePaths[0]): 
      for f in fnames: 
       if 'DIR.EDB' in f or 'PRIV.EDB' in f: 
        f = open(os.path.join(dirpath, f), 'rb') 
        f.read(1) #Problem line! 
        f.close() 
        if count > 80: 
         print 'EXIT' 
         sys.exit(1)      
        count += 1 
mem_test() 
+2

तो क्या '#Problem लाइन पर होता है'? एक त्रुटि? ... क्या आपको वापसी मूल्य की आवश्यकता है? – Ryan

+0

क्या यह तब भी होता है जब आप पढ़ नहीं पाते? खुला मत करो? 'Fnames' पर पुन: प्रयास न करें? –

+0

@ जेसनग्रे: क्या आपकी समस्या अभी भी होती है, जब आप मैन्युअल ओपनिंग/क्लोजिंग को 'दस्तावेज] में उल्लिखित' साथ 'कथन में बदलते हैं (http://docs.python.org/2/tutorial/inputoutput.html#methods- के-फ़ाइल-वस्तुओं)? यह सुरक्षित है कि रास्ता: 'खुले (os.path.join (dirpath, f),' आरबी ') के रूप में f: f.read (1) '। हो सकता है कि आप इन फ़ाइलों को बंद न करें, भले ही हम यहां क्या देखते हैं? – Tadeck

उत्तर

-1

स्मृति मुद्दे के समाधान के लिए, मुझे लगता है कि आप एक जनरेटर का उपयोग करना चाहें:

def mem_test(): 
    for dirpath, dnames, fnames in scandir.walk(restorePaths[0]): 
     for f in fnames: 
      if 'DIR.EDB' in f or 'PRIV.EDB' in f: 
       with open(os.path.join(dirpath, f), 'rb') as f: 
        yield f.read(1) #Problem line! 

results = [x for x in mem_test()] 
+0

@downvoters: क्यों नहीं? – Brian

+0

मैंने डाउन-वोट नहीं किया लेकिन मैंने कोशिश की और इसका एक ही प्रभाव पड़ा। क्षमा करें –

+0

यह वास्तव में प्रश्नकर्ता के नमूना कोड की तुलना में * अधिक * स्मृति का उपयोग करना चाहिए, क्योंकि नमूना 'f.read' वापसी मान को बिल्कुल भी नहीं बचाता है। – user2357112

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