2013-07-11 154 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