python del没有释放所有内存

use*_*109 3 python memory del pandas

在我的python程序中,我pandas用来读取csv文件并存储在内存中:

data = pandas.read_csv('data.csv')
Run Code Online (Sandbox Code Playgroud)

在运行上面的命令之前,我检查空闲内存,free -m输出是1704.运行上面的命令后输出为729.我跑

del(data)
Run Code Online (Sandbox Code Playgroud)

释放使用的内存data.现在,当我检查空闲内存时,输出1093比原始内存小得多1704.其余的去哪儿了?我怎么能免费呢?我正在运行所有这些ipython,甚至退出ipython也没有释放内存.

谢谢.

22d*_*ees 10

"退出ipython不会释放内存"意味着你在操作系统级别上看到了这种效果.您可能已经看到了内存缓存的影响.该数据保存在内存中,直到需要空间或再次读取文件 - 而不是从磁盘读取文件,它将从内存的"非活动"部分读取.

假设您使用的是某些unix/linux变体,有关ram使用的详细信息

cat /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

您的可用内存为Free + Inactive.Free现在可用,操作系统将根据需要从Inactive中回收空间.我保留以下别名(在csh中)来检查

alias 'freemem' cat /proc/meminfo | grep -i 'inactive:\|memfree:'
Run Code Online (Sandbox Code Playgroud)

Python的del将从命名空间中删除您的变量.因此,如果代码中的其他地方没有引用该内存,python的垃圾收集将启动并清除内存中的数据.或者如果你想强迫它:

import gc
foo = range(10000000)
del foo
gc.collect()
Run Code Online (Sandbox Code Playgroud)

无论如何,操作系统将保持文件内容缓存,因此当您尝试再次读取同一文件时,它不必执行冗余磁盘读取.

  • "Python的del将清除内存中处理过的数据"我不认为这是真的.它不会清除记忆.它将从命名空间中删除它,并且(我相信)将引用计数设置为0. (2认同)
  • 也许我只是挑剔,因为你在技术上并没有错,但"将它标记为垃圾收集"与释放我记忆中的记忆并不相同.您正在标记要由垃圾收集器释放的内存.您无法保证下一行Python代码可以释放该内存,但您可以保证不再尝试访问它,并且它将在下一次垃圾回收时消失. (2认同)
  • 我想我跑得快一点.你肯定是对的.我将编辑我的答案,以反映真实情况,而不是"有效"发生的事情. (2认同)
  • 不管怎样,我对你投了赞成票,因为我认为你对缓存的评论比我的更能真实地回答正在发生的事情:) (2认同)

use*_*723 5

del不是 Cfree或 C++delete

6.5. 德尔声明

del_stmt ::= "del" target_list

删除的递归定义与赋值的定义方式非常相似。这里没有详细说明,而是一些提示。

删除目标列表会从左到右递归地删除每个目标。

删除名称会从本地或全局名称空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块中的全局语句中。如果名称未绑定,则会引发 NameError 异常。

如果某个名称作为嵌套块中的自由变量出现,则从本地命名空间中删除该名称是非法的。

属性引用、订阅和切片的删除传递给所涉及的主要对象;切片的删除通常等同于分配正确类型的空切片(但即使这也是由切片对象决定的)。

源 Python 规范

你没有释放内存。你告诉python你已经完成了那个变量。