【发布时间】:2011-11-19 03:19:55
【问题描述】:
Python ctypes 是否存在已知的内存泄漏?我正在使用ctypes 编写具有以下sn-p 代码的Python 脚本,由于某种原因导致内存泄漏。本例中的“while True”是为了测试调用函数引起的泄漏。它正在使用 Python 2.5.4 在 Windows 上运行:
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
可以使用 ProcessExplorer 测试泄漏——因为它不断循环,Python 不断占用越来越多的内存。似乎需要有两个 Structure 子类,其中一个类具有另一个类的“倍数”(使用* 运算符),但我不确定条件是否比这更基本。即使在循环中添加了del test,它仍然会泄漏内存。
有什么可能导致这种情况的想法吗?
编辑:因为有人建议它可能还没有进行垃圾收集,所以这里有一个编辑后的版本,它会进行垃圾收集但似乎仍然会泄漏内存:
import gc
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
test2=gc.collect()
【问题讨论】:
-
泄漏了多少?它为每个
c1创建一个字节吗?有一个计数器,每 50,000 次调用hi()就会打印一次,这样你就知道了。 -
在 ProcessExplorer 中,“工作集”内存以每秒大约 20-30 KB 的速度稳步增长,并且每隔一段时间,“私有字节”就会赶上这一速度。大约 12 分钟后,我的内存已经超过 59 MB,并且正在计算在解释器中运行的第二个 sn-p。如何在代码中放置一个计数器,告诉您正在占用多少内存?其他人可以证实我的这一点吗?
-
最简单的方法是在顶部添加
from itertools import count,然后将while True:更改为for c in count():,然后在循环中添加if not c % 50000: print c。然后,如果prints 太频繁或太少而无用,则增加或减少50000。 -
我添加了一个错误跟踪器案例;这是交叉引用:bugs.python.org/issue12998
-
从对该案例的回复中可以看出,这不是泄漏。您真的不应该尝试将进程资源管理器用作泄漏检测工具。
标签: python memory-leaks ctypes