什么时候在python函数中释放内存

时间:2014-09-18 22:58:48

标签: python

我有以下代码:

f = open(file).readlines() # 2GB file
for item in f:
    print f

# some other stuff

g = open(file2).readlines() # 3 GB file
for item in g:
    print g

g的内存何时释放? f怎么样?如果它没有被释放,我该怎么做?

2 个答案:

答案 0 :(得分:3)

  

g的内存何时释放?

这取决于你的意思"释放"。

从Python的角度来看,它并非如此。只要您对该列表有一些参考,您可以随时使用(您在变量g中使用),就可以释放 。否则,如果您以后尝试使用g会发生什么?但Python的观点并不是基于计算机中的实际RAM芯片。你的操作系统让每个程序假装它拥有比你需要的更多的大量内存。*当然,这实际上并非如此;请参阅下文,了解更多信息,但现在让我们坚持使用Python的观点。

如果您放弃对该列表的所有引用 - 例如,从当前范围返回,或者将其他内容分配给g,或者执行del g(所有假设<&#39;是< em> only reference),然后可以释放用于列表的所有内存。 (在CPython中,它通常会立即发生;在其他实现中,通常只是&#34;很快&#34;。)

但&#34;释放&#34;并不意味着&#34;返回操作系统&#34;。一般来说,它会被保留在空闲列表中(实际上是几个不同级别的空闲列表),假设如果你现在需要3GB,你可能会再次想要3GB,所以Python也可以保留存储空间周围,​​因为这比重新分配更快。 (因此,如果您在创建f之前发布g,那么g将从空闲列表中取出大部分2GB,并且只分配另外1GB。)


但是&#34;没有返回到操作系统&#34;并不意味着&#34;连接到物理内存&#34;。在这里,我们将了解Python的视图和硬件视图之间的区别。如果你只有8GB的物理内存和6个同时拥有12GB数据的程序,那么64GB的额外容量是多少?它存储在磁盘上,并在您下次尝试使用时从磁盘重新加载。通常情况下它会做得很好。**所以,如果你再也没有触及那个3GB,而你系统上的其他一些程序需要一些内存,你的操作系统可能会将它从RAM中分页,而不是页面它回来了。


在相关的说明中,您也永远不会close您的文件对象。这意味着文件句柄仍然打开,直到垃圾收集器注意到没有人再次使用它们。同样,这通常会立即出现在CPython中,通常不会出现在其他实现中。但不要依赖于此。 close您的文件 - 或者更好的是,使用with语句。


*在这里插入640K笑话。

**但是,它很容易被恶意或意外地阻止它做得很好。例如,创建一个包含300亿个整​​数的列表,并随机更改随机值,并且您的操作系统将花费大量时间来交换页面,使其无法执行任何操作...

答案 1 :(得分:1)

假设这是整个程序,在这两种情况下,内存将被保留,直到程序终止。

你可以通过添加:

来加快一点
 f = None
第一次循环后

。这将允许(但不要求)垃圾收集清理第一个2Gb。

更好的是,采用一种处理文件的方法,不需要你将整个magilla读入内存。