2013-07-11 11 views
5

大きなファイルから1バイトを読みたいというこの機能があります。唯一の問題は、一定量のファイルを読み込んだ後に、PC上のメモリが、ファイルの読み込み回数に応じて安定した1.5GBから4GB以上にジャンプすることです。 (私は80以上のファイルがクラッシュするので、私のPCはクラッシュします)大きなファイルから1バイトを読み取る

私が望むのは、ファイル全体ではなく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:マニュアルの開閉を[with the documentation](http://docs.python.org/2/tutorial/inputoutput.html#methods-japanese)で述べられているような 'with'ステートメントに変更しても、 of-file-objects)?それはf:f.read(1) 'として' open(os.path.join(dirpath、f)、 'rb')を使ってより安全です。これらのファイルは、ここに表示されているものに関係なく閉じないでください。 – 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'の戻り値を全く保存しないので、質問者のサンプルコードよりも* more *メモリを実際に使用する必要があります。 – user2357112

関連する問題