KivyMD动态创建销毁组件引发内存(RAM)持续上涨问题求助
概述
我正在开发一个大型KivyMD项目,包含多个展示各类信息的界面。最初把所有界面加载到单个KV文件中,导致加载时间过长,操作系统甚至会判定程序崩溃。
于是改为通过Python手动添加和删除组件,动态创建每个新Screen。加载时间有所改善,但发现每次添加并销毁一组组件后,系统内存(RAM)都会上涨。我编写了测试程序复现该问题,但无法确定原因。我的目标是能够随意创建和销毁组件而不导致内存上涨。
环境信息
- KivyMD: 1.0.2
- Kivy: 2.1.0
- Python: 3.10.4
- 系统:Ubuntu 22.04 及 Windows 10
已尝试方案
为此困扰数周仍未解决。尝试过使用gc.collect()手动清理不再被引用的内存,也尝试过用Python的del函数删除组件等方法。
我推测是某些对象持有这些组件的引用,导致clear_widgets()或remove_widget()仅将组件从界面移除,并未清除其引用。尝试用heapy/guppy追踪组件引用,但无法理解输出结果。也可能是我忽略了某些简单问题。
代码示例
运行以下代码,系统内存会持续上涨直至进程被终止:
from kivymd.app import MDApp from kivymd.uix.screen import MDScreen from kivymd.uix.button import MDRectangleFlatButton from kivymd.uix.label import MDLabel from kivy.clock import Clock from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.textfield import MDTextField counter = 0 class MainApp(MDApp): def build(self): #Add MDFloatLayout as root widget layout = MDFloatLayout() #Schedule add_items() function to be called every second self.clock_obj = Clock.schedule_interval(self.add_items, 1) return layout def add_items(self, dt): #Increment global counter global counter counter += 1 #Clear all widgets self.root.clear_widgets() label = MDLabel(text="Count " + str(counter), pos_hint={"x": 0.5, "top": 0.5}, size_hint=(.1, .1)) button= MDRectangleFlatButton(text="Count " + str(counter), pos_hint={"x": 0.5, "top": 0.6}, size_hint=(.1, .1)) field = MDTextField(hint_text="Count " + str(counter), mode="fill", pos_hint={"x": 0.5, "top": 0.7}, size_hint=(.1, .1)) #Add all widgets to parent layout self.root.add_widget(label) self.root.add_widget(button) self.root.add_widget(field) return
如需更多信息用于排查问题,请告知。提前感谢大家的帮助。
更新(2022年9月3日)
相关人员已在KivyMD Github上提交了Bug工单,目前排查工作仍在进行中。
内容的提问来源于stack exchange,提问作者brant18
相关产品推荐
相关产品推荐

