python del没有释放所有内存

python del没有释放所有内存,python,memory,pandas,del,Python,Memory,Pandas,Del,在我的python程序中,我使用pandas读取csv文件并存储在内存中: data = pandas.read_csv('data.csv') 在运行上述命令之前,我用free-m检查空闲内存,输出为1704。运行上述命令后,输出为729。我跑 del(data) 释放数据使用的内存。现在,当我检查空闲内存时,输出是1093,这比原来的1704小得多。其余的去了哪里?我怎样才能释放它?我在ipython中运行所有这些,即使退出ipython也无法释放内存 谢谢。“退出ipython不会释放

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

data = pandas.read_csv('data.csv')
在运行上述命令之前,我用
free-m
检查空闲内存,输出为
1704
。运行上述命令后,输出为
729
。我跑

del(data)
释放
数据使用的内存。现在,当我检查空闲内存时,输出是
1093
,这比原来的
1704
小得多。其余的去了哪里?我怎样才能释放它?我在
ipython
中运行所有这些,即使退出ipython也无法释放内存

谢谢。

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

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

cat /proc/meminfo
您的可用内存为空闲+非活动。现在可以免费使用,操作系统将根据需要从非活动状态中回收空间。我保留以下别名(在csh中)以供检查

alias 'freemem' cat /proc/meminfo | grep -i 'inactive:\|memfree:'
Python的del将从名称空间中删除变量。所以,如果代码中的其他地方没有引用该内存,python的垃圾收集将启动并清除内存中的数据。或者,如果您想强制执行:

import gc
foo = range(10000000)
del foo
gc.collect()

不管怎么说,操作系统都会缓存文件内容,这样当你再次尝试读取同一个文件时,它就不必进行冗余的磁盘读取。

del
不是C的
free
或C++
delete

6.5。del语句

del_stmt::=“del”目标列表

删除是递归定义的,非常类似于赋值的方式 定义以下是一些细节,而不是详细说明 提示

目标列表的删除递归地从左侧删除每个目标 向右

删除一个名称将从本地或本地数据库中删除该名称的绑定 全局命名空间,具体取决于名称是否出现在全局命名空间中 语句位于同一代码块中。如果名称未绑定,则会出现名称错误 将提出例外情况

如果从本地命名空间中删除名称是非法的 作为嵌套块中的自由变量

传递属性引用、订阅和slicing的删除 涉及的主要对象;通常情况下,需要删除切片 相当于分配正确类型的空片(但偶数) 这由切片对象确定)


你没有释放记忆。您告诉python您已经完成了该变量。

您真的不应该担心python中的内存管理。如果您希望该变量消失,请在函数范围内使用它。谢谢。现在,释放该变量所使用的全部内存的好方法是什么?在Python中确实没有一种好方法可以真正做到这一点。你无法控制记忆。您所能做的就是让变量离开作用域或使用
del
将其标记为垃圾收集。还要注意@scf关于缓存的回答。如果您编写的代码需要这种类型的控件,那么您使用的语言是错误的。您只能用C编写该函数,也可以完全切换到C[++]或其他较低级别的语言。@user2725109我刚刚遇到这样一个问题:如果您像上面那样使用del,您可以使用gc.collect()强制垃圾收集。“Python的del将从内存中清除处理过的数据”我不认为这是真的。它无法清除记忆。它将从命名空间中删除它,并(我相信)将引用计数设置为0。如果我错了,请纠正我的错误,但从命名空间中删除它不会将其标记为符合垃圾收集条件,从而有效地将其从内存中清除吗?在我使用(OSX、Python 2.7.10、Anaconda 2.3.0(x86_64)|)的系统上,我可以制作价值800 MB的numpy数组,看到上面的效果,使用del,内存就被释放了。也许我只是挑剔,因为你在技术上没有错,但“将其标记为垃圾收集”在我心目中并不等同于释放内存。您正在将内存标记为由垃圾收集器释放。你不能保证下一行Python代码会释放内存,但是你可以保证你不能再尝试访问它,并且它会在下一次垃圾收集时消失。我想我运行得有点快,有点松。你绝对是对的。我将编辑我的答案,以反映真实情况,而不是“有效”情况。无论如何,我对你投了更高的票,因为我认为你关于缓存的评论比我的更能反映实际情况:)