2013-07-11 155 views
5

我有這個功能,我想從一個大文件中讀取一個字節。唯一的問題是,在一定數量的文件讀取後,pc上的內存從穩定的1.5gb跳到4gb和更高,取決於文件讀取的次數。 (我打破了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

@JasonGray:如果您將手動打開/關閉變爲像'[文檔]中提到的''語句一樣,您的問題是否仍然存在?(http://docs.python.org/2/tutorial/inputoutput.html#methods-的文件對象)?這樣比較安全:'用open(os.path.join(dirpath,f),'rb')作爲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

這應該實際使用* more *內存比提問者的示例代碼,因爲該示例根本不保存'f.read'返回值。 – user2357112