在我的python程序中,我使用pandas读取csv文件并将其存储在内存中:
data = pandas.read_csv('data.csv')在运行上面的命令之前,我用free -m检查了空闲内存,结果是1704。运行上述命令后,输出为729。我跑步
del(data)释放data使用的内存。现在,当我检查空闲内存时,输出是1093,它比原来的1704小得多。剩下的都去哪了?我怎样才能释放它?我在ipython中运行所有这些,即使退出ipython也不能释放内存。
谢谢。
发布于 2016-02-01 09:32:40
“退出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()尽管如此,操作系统将缓存文件内容,这样当您再次尝试读取相同的文件时,它就不需要进行冗余的磁盘读取。
发布于 2016-02-01 09:34:04
del不是C的free或C++的delete
6.5。del语句
del_stmt ::= "del“target_list
删除是递归定义的,与定义赋值的方式非常相似。以下是一些提示,而不是详细说明。
目标列表的删除从左到右递归地删除每个目标。
删除名称会从本地或全局命名空间中移除该名称的绑定,具体取决于该名称是否出现在同一代码块中的全局语句中。如果名称未绑定,则会引发NameError异常。
如果名称作为自由变量出现在嵌套块中,则从本地名称空间中删除该名称是非法的。
属性引用、订阅和切片的删除被传递到所涉及的主对象;切片的删除通常等同于分配正确类型的空切片(但即使这也是由切片对象确定的)。
你没有释放内存。你是在告诉python你已经完成了这个变量。
https://stackoverflow.com/questions/35121659
复制相似问题