2012-09-21 162 views
4

当我在Windows中运行该Python脚本,过程长,看不到明显的结束:os.walk是否泄漏内存?

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

+0

该过程每次通过外部循环增长约7MB。我可以理解使用大量内存进行一次遍历,但不应该在此之后重新使用它? – user1687699

+0

@ user1687669你必须把东西加载到内存中。垃圾收集器可能没有立即清理它,因为GC中存在“引用计数”的概念。如果引用计数不为零,它将在一段时间内保留在内存中。有可能的。一种可能的强烈记忆可能来自文件系统元数据。每个文件/文件夹都有附加的元数据,比如模式,用户,日期等等。我会仔细研究这个问题,因为我的项目实际上是用文件系统做的,所以很好,你实际上提出了这个问题。 – CppLearner

回答

4

这是由于在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)