首页 > 解决方案 > 函数内部的对象在超出范围后不会被销毁,导致内存泄漏

问题描述

通常,我希望当局部变量超出范围时,应该从内存中收集它。在这里,我体验到了不一样的东西。我尝试循环运行 scikit-fuzzy 文档(此处)中给出的示例,但遇到内存泄漏。这是最小的例子,

from skfuzzy import control as ctrl
from pympler import muppy,tracker
import skfuzzy as fuzz
import numpy as np
import sys

def base_example():
    quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality')
    service = ctrl.Antecedent(np.arange(0, 11, 1), 'service')
    tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')
    quality.automf(3)
    service.automf(3)
    tip['low'] = fuzz.trimf(tip.universe, [0, 0, 13])
    tip['medium'] = fuzz.trimf(tip.universe, [0, 13, 25])
    tip['high'] = fuzz.trimf(tip.universe, [13, 25, 25])
    rule1 = ctrl.Rule(quality['poor'] | service['poor'], tip['low'])
    rule2 = ctrl.Rule(service['average'], tip['medium'])
    rule3 = ctrl.Rule(service['good'] | quality['good'], tip['high'])
    tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])
    tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
    tipping.input['quality'] = 6.5
    tipping.input['service'] = 9.8
    tipping.compute()
if __name__ == '__main__':
    tr = tracker.SummaryTracker() # to show the initial list of objects
    for i in range(100000):
        base_example()
        if i%500==0: # we monitor different in the list of objects every 500 iterations
            print('Iteration ',i)
            tr.print_diff() # to show the difference beween this iteration and the base one

由于没有对象base_example存储在全局变量中,我希望当函数base_example到达末尾时,对象被删除并释放内存,但这里不会发生。有任何想法吗?

标签: pythonmemory-leaksskfuzzy

解决方案


推荐阅读