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
相关产品推荐
相关产品推荐

