python - 重新运行单元格时,Spyder 不会释放内存
问题描述
Spyder 的内存管理最近让我发疯。我需要加载大型数据集(最大 10 GB)并对其进行预处理。稍后我执行一些计算/建模(使用 sklearn)并在它们上绘图。Spyder 的单元功能非常适合这一点,因为它允许我多次运行相同的计算(使用不同的参数),而无需重复耗时的预处理步骤。但是,由于各种原因,我在重复运行单元格时遇到了内存问题:
- 多次重新运行同一个单元会增加内存消耗。我不明白这一点,因为我没有引入新变量,而以前的(全局)变量应该被覆盖。
- 将变量封装在函数中会有所帮助,但不会达到预期的程度。我有一种强烈的感觉,局部变量的内存通常没有被正确释放(这在使用 .copy() 返回任何值以避免引用局部变量时也成立)。
- 大型 matplotlib 对象无法正确回收。运行 gc.collect() 有时会有所帮助,但并不总是从图中清除所有已使用的内存。
- 当使用 IPython 控制台中的“清除所有变量”按钮时,通常只有部分内存被释放,而几 GB 的内存可能仍被占用。
- 从 IPython 控制台运行 %reset 效果更好,但并不总是完全清除内存(即使之后运行 import gc; gc.collect() )。
- 唯一可以肯定的是重新启动内核。但是,我不喜欢这样做,因为它会删除控制台的所有输出。
对上述任何一点的建议,以及对 Spyder 内存管理的一些详细说明,都值得赞赏。我在我的代码中使用了多线程,并且怀疑某些问题与此有关,即使我无法查明问题。
解决方案
推荐阅读
- reactjs - 什么是开发具有 15 个字段的表单的最佳过程,特别是使用 React JS,没有 Redux 或任何其他的语义 UI
- python - How do I get a substring of a string in Python using a recursive function?
- time - 如何在 lua 中将分钟和秒添加到日期时间?
- python - 乘法表python嵌套循环不打印完整表
- karate - How to connect to documentDB using karate?
- python - 如何将结合低频类别/值的 python 代码转换为可应用于任何 pandas 数据框列的函数?
- android - Custom view ClassNotFoundException from LayoutInflater
- javascript - 错误:setState(...):需要一个状态变量对象来更新或一个返回状态变量对象的函数
- android - 如何使用 ChipGroup android 设置 ViewPager?
- jquery - 使用jsp从数据库中获取文件名失败