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。)
当我在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。)
这是由于在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)
嘛。 'C:\ windows'是一个很大的图表,对吧?很深。很深。过程增长如何与内存泄漏等同? – CppLearner
该过程每次通过外部循环增长约7MB。我可以理解使用大量内存进行一次遍历,但不应该在此之后重新使用它? – user1687699
@ user1687669你必须把东西加载到内存中。垃圾收集器可能没有立即清理它,因为GC中存在“引用计数”的概念。如果引用计数不为零,它将在一段时间内保留在内存中。有可能的。一种可能的强烈记忆可能来自文件系统元数据。每个文件/文件夹都有附加的元数据,比如模式,用户,日期等等。我会仔细研究这个问题,因为我的项目实际上是用文件系统做的,所以很好,你实际上提出了这个问题。 – CppLearner