2011-09-17 45 views
3

Python​​有没有已知的内存泄漏?我正在研究Python脚本,其代码如下所示,使用​​,由于某些原因导致内存泄漏。本例中的“while True”用于测试调用函数引起的泄漏。它被Windows上使用Python 2.5.4运行:Python:CTypes结构内存泄漏

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() 
+0

它泄漏多少?它为每个创建的“c1”创建一个字节?有一个计数器,每打印50,000个电话给'hi()'左右,所以你知道。 – agf

+0

在ProcessExplorer中,“工作集”内存每秒稳定增加大约20-30 KB,“私人字节”每隔一段时间都会稳步增长。大约12分钟后,我已经超过59 MB的内存,并计算在解释器中运行的第二个片段。如何在代码中放置一个计数器,告诉你有多少内存被占用?任何人都可以在此证实我吗? – user553702

+0

最简单的方法是在顶部添加'from itertools import count',然后在count():中将c改为'true:',然后在循环中添加'如果不是c%50000:print c' 。然后,如果“印刷品”过于频繁或不常用,则增加或减少“50000”。 – agf

回答

2

这不是内存泄漏,这只是意味着垃圾收集器尚未运行。即使垃圾收集器运行,可能性也很大,有一些内存池正在进行。

ProcessExplorer不是一个好的调试工具,特别是对于内存。

+0

即使我在循环内部添加了“import gc”,并且在循环内部添加了“test2 = gc.collect()”,它占用的内存仍然保持增长。 “内存池”是什么意思?记忆在某些时候不应该被释放吗? – user553702

+0

内存池意味着一个区域被放置在一边(在Python中),它保存着空闲的内存。这是一种优化技术。它只*看起来像正在使用的内存。 –

1

脚本本身不泄漏。使用gc.set_debug(gc.DEBUG_LEAK)运行时显示创建的结构类型是可收集的,并且gc.garbage在每个循环迭代中都保持为空,所以不存在无法收集的对象。在Linux系统上运行time的脚本也不会显示内存消耗的稳步增加。