Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.walk内存问题_Python_Memory_Os.walk - Fatal编程技术网

Python os.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的内存 有没有办法避免这种行

我设计了一个扫描仪,可以在被扫描系统的所有硬盘上查找特定文件。其中一些系统相当陈旧,运行的Windows 2000具有256或512 MB的RAM,但文件系统结构很复杂,因为其中一些系统用作文件服务器

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

不幸的是,我们注意到扫描仪在扫描一段时间后消耗了大量RAM,我们发现仅os.walk函数在文件系统上漫游2小时后就使用了大约50 MB的RAM。随着时间的推移,RAM的使用会增加。经过4个小时的扫描,我们有大约90MB的内存

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


谢谢

您试用过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上复制它吗?如果你把它变成生成器,效果会更好。