【问题标题】:R-like object deletion and memory freeing in python?在 python 中类似 R 的对象删除和内存释放?
【发布时间】:2019-06-25 11:49:31
【问题描述】:

我来自 R,我似乎无法在 python 中解决这个超级基本问题。

假设我在 R 中拟合了一个随机森林。它位于一个名为 rf 的对象中。它占用内存。如果我执行rm(rf),当我查看htop 或在shell 中键入free 时,内存就会被释放。

如果我在 python 中并适合 RandomForestRegressor 并将其命名为 rf,然后执行 del rf什么都不会发生

我可以先import gc 然后gc.collect(),然后什么都没发生

显然 python 太酷了,这样的事情不容易。如何恢复记忆?

【问题讨论】:

  • 你对这个对象有任何挥之不去的引用吗?
  • Python 使用自动垃圾回收。 CPython 特别使用引用计数。您可能仍然在某处引用了您的模型。
  • @badger0053 为什么与del rf 不同?
  • @badger0053 不,这根本没有发生。 del rf 不调用rf.__del__(反正直接调用)。 del rf 只是删除名称rfrf 引用的对象少了一个引用。与x = None 的效果相同,并且绝对不正确的是“。对 rf 的引用仍然存在,除非它将是 None 对象而不是 RandomForestRegressor。”。对该对象的所有其他引用都不受rf = Nonedel rf 的影响。
  • 我认为问题在于 Python 并非旨在用于 Jupyter notebook 或 IPython shell 中的探索性数据分析。这两件事都会创建大量对您甚至不会想到的对象的引用(例如 REPL 历史),这可能会导致您的对象滞留。请注意,只需执行 my_obj 以查看笔记本或 repl 中的内容将创建对 my_object 的引用,这将使其保持活动状态

标签: python r memory


【解决方案1】:

这意味着你在某处有另一个引用。

如果需要调试,可以使用print(sorted(globals()))print(sorted(locals())) 列出当前引用。如果您熟悉gc,则可以使用gc.get_objects() 查看每个引用的对象。使用del 删除您不需要的引用。当您没有引用对象Cpython 时,将自动进行垃圾收集。

至少理论上是这样...因为,您正在使用的模块也可以保留一个引用,并且由于您保留了对该模块的引用,它不会被垃圾收集。您可以完全删除模块持有的引用(通过使用introspection)或del module。也许您的对象有一个close 函数或其他必须执行以释放资源的函数(可能是auto-closable)。

不用说,引用保持是模块应该避免的。

【讨论】:

  • 谢谢。似乎 python 创建了很多我从未告诉过它的对象,作为副作用。伙计,我希望人们更加欣赏 R。这种更好的数据交互工作语言。
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多