Python os.walk内存问题

时间:2014-06-29 07:54:22

标签: python memory os.walk

我编写了一个扫描程序,用于查找扫描系统的所有硬盘驱动器上的某些文件。其中一些系统相当陈旧,运行带有256或512 MB RAM的Windows 2000,但文件系统结构很复杂,因为其中一些系统用作文件服务器。

我在我的脚本中使用os.walk()来解析所有目录和文件。

不幸的是我们注意到扫描仪在扫描一段时间后消耗了大量的RAM,我们发现os.walk功能在文件系统上行走2小时后单独使用大约50 MB的RAM。此RAM使用量随着时间的推移而增加。扫描4小时后,我们有大约90 MB的RAM。

有没有办法避免这种行为?我们还尝试了“betterwalk.walk()”和“scandir.walk()”。结果是一样的。 我们是否必须编写自己的walk函数,从内存中删除已扫描的目录和文件对象,以便垃圾收集器可以不时删除它们?

resource usage over time - second row is memory

由于

3 个答案:

答案 0 :(得分:1)

你试过过glob模块吗?

import os, glob

def globit(srchDir):
    srchDir = os.path.join(srchDir, "*")
    for file in glob.glob(srchDir):
        print file
        globit(file)

if __name__ == '__main__':
    dir = r'C:\working'
    globit(dir)

答案 1 :(得分:0)

如果您在os.walk循环中运行,del()您不再需要的所有内容。并尝试在gc.collect()的每次迭代结束时运行os.walk

答案 2 :(得分:0)

生成器是更好的解决方案,因为它们进行延迟计算 这是一个实施的例子。

import os
import fnmatch

#this may or may not be implemented
def list_dir(path):
    for name in os.listdir(path):
        yield os.path.join(path, name)

#modify this to take some pattern as input 
def os_walker(top):
    for root,dlist,flist in os.walk(top):
        for name in fnmatch.filter(flist, '*.py'):
            yield os.path.join(root, name)

all_dirs = list_dir("D:\\tuts\\pycharm")

for l in all_dirs:
    for name in os_walker(l):
        print(name)

感谢David Beazley