我来自R,我似乎无法弄清楚python中的这个超基本问题。
说我在R中放入一个随机森林。它位于一个名为rf
的对象中。它占用内存。如果执行rm(rf)
,则在查看htop
或在外壳程序中键入free
时会释放内存。
如果我使用python并适合RandomForestRegressor
并将其命名为rf
,则进行del rf
,什么都不会发生。
我可以先import gc
然后gc.collect()
,然后什么都没有发生
对于这样的事情,Python很酷,太简单了。如何找回记忆?
答案 0 :(得分:1)
这意味着您在某处有另一个引用。
如果需要调试,可以使用print(sorted(globals()))
和print(sorted(locals()))
列出当前引用。如果您熟悉gc
,则可以使用gc.get_objects()
查看每个引用的对象。使用del
删除不需要的引用。当您没有引用对象时,Cpython
将自动进行垃圾收集。
至少这是理论……因为,您使用的模块也可以保留引用,并且由于您保留对模块的引用,因此不会对其进行垃圾回收。您可以完全删除模块保存的引用(通过使用introspection)或del module
。也许您的对象具有close
函数或必须执行以释放资源的其他函数(也许是auto-closable)。
不用说,保持引用是模块应避免的事情。