You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python对象删除后内存占用持续增长的问题排查与解决咨询

Python对象删除后内存占用持续增长的问题排查与解决咨询

各位好,我目前在开发一个基于面向对象的图像处理项目,核心逻辑是当配置项变化(通过self.set_variables.has_changed()触发)时,销毁所有已创建的实例对象并重新初始化,但遇到了内存占用持续增长的问题,想请教大家如何解决这个问题。

项目核心代码结构

我的ObjectDetector类负责初始化所有核心组件,当配置变化时会尝试重新初始化:

from set_variables import SetVariables
from model_loader import ModelLoader
from open_stream import VideoStreamHandler
from log_record import LogRecording
import sys
import gc
from pympler import asizeof

class ObjectDetector:
    liste = []
    def __init__(self):
        self.reinit()
        self.start_detection()
    
    def reinit(self):
        gc.collect()
        self.set_variables: SetVariables = SetVariables()
        self.log_cl: LogRecording = LogRecording(self.set_variables)
        self.log_cl.logger_info("INIT STARTED")
        self.model_cl: ModelLoader = ModelLoader(self.set_variables, self.log_cl)
        self.stream_cl: VideoStreamHandler = VideoStreamHandler(self.set_variables, self.log_cl)

    def start_detection(self):
        while True:
            try:
                if self.set_variables.has_changed():
                    self.reinit()

尝试的解决方法及异常现象

我一开始直接调用reinit(),后来尝试用del关键字手动删除旧对象,再重建,但每次触发配置变化时,用pympler.asizeof查看对象大小,发现每个对象的内存占用都在持续增长:

if self.set_variables.has_changed():
    del self.set_variables
    del self.log_cl
    del self.model_cl
    del self.stream_cl
    self.reinit()
    print("1-self.set_variables", asizeof.asizeof(self.set_variables))
    print("1-self.log_cl", asizeof.asizeof(self.log_cl))
    print("1-self.model_cl", asizeof.asizeof(self.model_cl))
    print("1-self.stream_cl", asizeof.asizeof(self.stream_cl))

运行后的输出如下,可见每次重建后对象大小都在逐步增加:

1-self.set_variables 1552
1-self.log_cl 6952
1-self.model_cl 1008440
1-self.stream_cl 6228352
[INFO][11/12/2024--14:54]: INIT STARTED
[INFO][11/12/2024--14:54]: [load_model] [MODEL LOADED SUCCESFULLY]
[INFO][11/12/2024--14:54]: [open_source] [CAM OPENED SUCCESFULLY]
1-self.set_variables 1552
1-self.log_cl 7928
1-self.model_cl 1009416
1-self.stream_cl 6229328
[INFO][11/12/2024--14:54]: INIT STARTED
[INFO][11/12/2024--14:54]: [load_model] [MODEL LOADED SUCCESFULLY]
[INFO][11/12/2024--14:54]: [open_source] [CAM OPENED SUCCESFULLY]
1-self.set_variables 1552
1-self.log_cl 8936       
1-self.model_cl 1010424 
1-self.stream_cl 6230336

我觉得这可能是旧对象没有被真正销毁导致的内存泄漏,但不确定这种现象是否正常?请问有没有正确的方法可以彻底关闭/销毁这些对象,避免内存持续增长?


备注:内容来源于stack exchange,提问作者yunus özpolat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:49:30