我有以下代码:
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
怎么样?如果它没有被释放,我该怎么做?
答案 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读入内存。