【发布时间】: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只是删除名称rf。rf引用的对象少了一个引用。与x = None的效果相同,并且绝对不正确的是“。对 rf 的引用仍然存在,除非它将是 None 对象而不是 RandomForestRegressor。”。对该对象的所有其他引用都不受rf = None或del rf的影响。 -
我认为问题在于 Python 并非旨在用于 Jupyter notebook 或 IPython shell 中的探索性数据分析。这两件事都会创建大量对您甚至不会想到的对象的引用(例如 REPL 历史),这可能会导致您的对象滞留。请注意,只需执行
my_obj以查看笔记本或 repl 中的内容将创建对my_object的引用,这将使其保持活动状态