从RAM内存中删除变量并不会清除其内存。

9

我在地球科学应用中广泛使用Python(Canopy)。由于我的应用程序需要消耗大量内存,因此我正在尝试找到一种方法来删除我程序中不再需要的变量。我尝试使用del命令来清除变量内存,但我发现Canopy使用的空间仍然相同。有没有办法完全从内存中删除变量?

谢谢

3
有没有测试用例可以展示给我们?另外,尝试使用 __import__("gc").collect() - d33tah
2
当使用像Python这样的语言时,您实际上没有直接控制内存何时被释放。如果您需要那种级别的控制,请考虑用C编写代码并自行处理内存管理。 - larsks
3
Canopy使用IPython内核,可能会保留变量以供未来交互使用;根据你正在做的事情,重新启动内核有时是恢复内存和刷新命名空间的好方法。 - Reblochon Masque
3
del 命令并不会删除对象,它只是删除对它们的引用。可以使用 sys.getrefcount() 或者 weakrefs 来查看是否还有其他东西在维持这个对象的存在。 - Andrea Corbellini
2
是的,请查看weakrefs以及它的用途。然后检查您的代码,看看是否有可能保留引用的地方。缓存是一个明显的点 - 您需要它们来加速,但从逻辑上讲您并不需要它们,因此在其中进行ref-hoarding是不好的。 - JL Peyret
显示剩余2条评论
2个回答

8

在 Python 中,你无法手动从内存中清除一个对象!

Python 垃圾回收器(GC)会自动释放那些没有被引用的对象的内存(实现细节因解释器而异)。它会定期在后台检查废弃的对象,而不需要你的干预。

所以,要回收一个对象,你必须通过将所有指向该对象的变量赋予不同的值(例如 None)来消除所有引用。你也可以使用 del 语句删除一个变量名,但是正如你已经注意到的那样,这只会删除具有引用的名称,而不是对象及其数据本身。只有 GC 才能做到这一点。


5
即使这样,回收的内存也不会立即返回给操作系统。就像许多复杂的程序一样,CPython解释器有自己的内部内存管理以提高效率。您可以在问题评论中的链接中阅读有关Python内存管理区域的信息,以及在文档中查看。 - PM 2Ring
2
以上所有的回应和评论都是正确的。总结一下:删除对象中的所有 Python 引用(包括 IPython 内核中的隐式引用),然后强制运行 Python 垃圾收集器,将使内存符合在同一个 Python 进程中重新使用的条件,并且通常会使它变得可供操作系统再次使用,但即便如此,在操作系统的统计数据中也不一定能够显示出来。 - Jonathan March
非常感谢大家的帮助。现在清楚了,从内存中删除变量并不是一件简单的事情。我认为可以采用一些技巧,比如删除所有Python引用,然后调用GC,或者像上面提到的那样创建子进程。但是,我在不同的平台上使用我的脚本,因此我不确定这些技术是否能够有效地跨越不同的平台。我需要进行测试。再次感谢。 - Kernel
Byte Commander,你的标题是不是意思是“我不能自动……”? - Kernel

2
现在,手动操作是可能的。要做到这一点,需要分两步进行:
  1. 使用命令del从工作区中删除变量
  2. 使用命令gc.collect运行垃圾回收器并清除RAM内存
代码示例:
import numpy as np
import gc

a = np.array([1,2,3])
del a
gc.collect()

更多信息:链接

不总是有效。如果对象引用计数不为零,则不会被垃圾回收。 - Chris Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接