os.walk是否存在内存泄漏问题?

5
当我在Windows上运行这个Python脚本时,进程似乎无限增长:
import os

for i in xrange(1000000):
    for root, dirs, files in os.walk(r"c:\windows"):
        pass

我是否有误解?(我正在使用Python 2.7.3。)

3
好的。C:\windows 是一个很大的目录,对吧?非常深入。进程增长如何与内存泄漏相等呢? - CppLearner
每次通过外部循环,该进程会增长约7MB。我可以理解一次遍历使用大量内存,但之后不应该被重复利用吗? - user1687699
@user1687669 你需要将东西加载到内存中。垃圾回收器可能没有立即清理它,因为在GC中有“引用计数”的概念。如果引用计数不为零,则它将在一段时间内保留在内存中。这是可能的。一个可能的内存密集型问题来自文件系统元数据。每个文件/文件夹都附有元数据,如模式、用户、日期等。我实际上会研究一下这个问题,因为我的项目实际上会处理文件系统,所以你提出这个问题真的很好。 - CppLearner
在Windows 7 64位操作系统下,使用相同的Python版本运行相同的代码时,进程不会超过7MB,在外层循环完成每次回归约4MB。这适用于Python 2.7.3的32位和64位版本。您正在运行完全相同的脚本吗? - Matthew Trevor
我让它一直运行,直到内存用尽: C:\Users\Eric\Documents>test.py Traceback (most recent call last): File "C:\Users\Eric\Documents\test.py", line 4, in <module> for root, dirs, files in os.walk(r"c:\windows"): File "S:\Python27\lib\os.py", line 294, in walk for x in walk(new_path, topdown, onerror, followlinks): File "S:\Python27\lib\os.py", line 294, in walk for x in walk(new_path, topdown, onerror, followlinks): File "S:\Python27\lib\os.py", line 287, in walk nondirs.append(name) MemoryError - user1687699
显示剩余4条评论
1个回答

5
这是由于在os.path.isdir中发现了内存泄漏;请参见重复调用os.path.isdir时出现的巨大内存泄漏?。您可以通过使用Unicode编码的路径字符串进行测试-不应该有泄漏。
os.walk实现中使用了os.path.isdir。
    islink, join, isdir = path.islink, path.join, path.isdir
    try:
        names = listdir(top)
    except error, err:
        if onerror is not None:
            onerror(err)
        return

    dirs, nondirs = [], []
    for name in names:
        if isdir(join(top, name)):
            dirs.append(name)
        else:
            nondirs.append(name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接