【问题标题】:Does os.walk leak memory?os.walk 是否泄漏内存?
【发布时间】:2012-09-13 11:33:27
【问题描述】:

当我在 Windows 中运行这个 Python 脚本时,进程会增长,但看不到明显的结束:

import os

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

我是不是误会了什么? (我使用的是 Python 2.7.3。)

【问题讨论】:

  • 好吧。 C:\windows 是要走的大图,对吧?挺深的。很深。进程增长如何等同于内存泄漏?
  • 进程通过外循环每次增长约7MB。我可以理解一次遍历使用大量内存,但之后不应该重复使用它吗?
  • @user1687669 您必须将内容加载到内存中。可能是垃圾收集器没有立即清理它,因为 GC 中有“引用计数”的概念。如果引用计数不为零,它将在内存中保留一段时间。有可能的。一种可能的内存密集型可能来自文件系统元数据。每个文件/文件夹都附加了元数据,例如模式、用户、日期等。我实际上会调查这一点,因为我的项目实际上是用文件系统做的,所以你提出这个问题真是太好了。
  • 在 Windows 7 64 位下运行相同的代码,相同的 Python 版本,进程不会超过 7MB,每次外循环完成时恢复到 4MB 左右。这适用于 Python 2.7.3 的 32 位和 64 位版本。那是您正在运行的确切脚本吗?
  • 是的,这就是确切的脚本。我已经在运行 32 位 Windows 7 的两台不同的机器上进行了尝试。我正在通过任务管理器的“内存 - 私有工作集”列测量使用情况。我在 Process Explorer 中得到与“私有字节”相同的结果。

标签: python memory-leaks os.walk


【解决方案1】:

这是由于在 os.path.isdir 中发现内存泄漏;见Huge memory leak in repeated os.path.isdir calls? 您可以使用 Unicode 编码的路径字符串自行测试 - 应该没有泄漏。

os.path.isdir 用于 os.walk 实现:

    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)

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2010-10-13
    • 2019-01-28
    • 2015-02-07
    • 2011-01-29
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多