Python os.walk内存问题
我设计了一个扫描仪,可以在被扫描系统的所有硬盘上查找特定文件。其中一些系统相当陈旧,运行的Windows 2000具有256或512 MB的RAM,但文件系统结构很复杂,因为其中一些系统用作文件服务器 我在脚本中使用os.walk()解析所有目录和文件 不幸的是,我们注意到扫描仪在扫描一段时间后消耗了大量RAM,我们发现仅os.walk函数在文件系统上漫游2小时后就使用了大约50 MB的RAM。随着时间的推移,RAM的使用会增加。经过4个小时的扫描,我们有大约90MB的内存 有没有办法避免这种行为?我们还尝试了“betterwalk.walk()”和“scandir.walk()”。结果是一样的。 我们是否必须编写自己的walk函数,从内存中删除已扫描的目录和文件对象,以便垃圾收集器可以随时删除它们Python os.walk内存问题,python,memory,os.walk,Python,Memory,Os.walk,我设计了一个扫描仪,可以在被扫描系统的所有硬盘上查找特定文件。其中一些系统相当陈旧,运行的Windows 2000具有256或512 MB的RAM,但文件系统结构很复杂,因为其中一些系统用作文件服务器 我在脚本中使用os.walk()解析所有目录和文件 不幸的是,我们注意到扫描仪在扫描一段时间后消耗了大量RAM,我们发现仅os.walk函数在文件系统上漫游2小时后就使用了大约50 MB的RAM。随着时间的推移,RAM的使用会增加。经过4个小时的扫描,我们有大约90MB的内存 有没有办法避免这种行
谢谢您试用过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)
如果您在
os.walk
循环中运行,del()
您不再需要的一切。在os.walk
的每次迭代结束时,尝试运行gc.collect()
,生成器是更好的解决方案,因为它们可以进行惰性计算
下面是一个实现示例
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)
多亏了我知道在
os.path.isdir
操作系统中使用的os.walk
实现中存在内存泄漏。据我所知,它在python 3中已修复,请参阅泄漏报告。解决方法是使用unicode路径。python 2.7.4版包含修复,因此,升级Python版本也会有所帮助。我使用的是版本2.7.7,它仍然是我描述的方式。也许这不是同一个问题?我将尝试使用unicode表示法。你能在Linux、OSX上复制它吗?如果你把它变成生成器,效果会更好。