我编写了一个扫描程序,用于查找扫描系统的所有硬盘驱动器上的某些文件。其中一些系统相当陈旧,运行带有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函数,从内存中删除已扫描的目录和文件对象,以便垃圾收集器可以不时删除它们?
由于
答案 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)