python del没有释放所有内存

时间:2016-02-01 01:17:01

标签: python memory pandas del

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

data = pandas.read_csv('data.csv')

在运行上述命令之前,我使用free -m检查空闲内存,输出为1704。运行上述命令后,输出为729。我跑

del(data)

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

感谢。

2 个答案:

答案 0 :(得分:8)

"退出ipython并没有释放内存"表示您在操作系统级别看到效果。您可能已经看到了内存缓存的影响。该数据保存在内存中,直到需要空间或再次读取文件 - 而不是从磁盘读取文件,它将从“非活动”中读取。记忆部分。

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

cat /proc/meminfo

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

alias 'freemem' cat /proc/meminfo | grep -i 'inactive:\|memfree:'

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

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

无论如何,操作系统都会保留文件内容的缓存,以便在您尝试再次读取同一文件时不必执行冗余磁盘读取。

答案 1 :(得分:4)

break;不是C的del或C ++的free

  

6.5。 del声明

     

del_stmt :: =“del”target_list

     

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

     

删除目标列表会从左侧递归删除每个目标   向右。

     

删除名称会删除该名称与本地名称的绑定   全局命名空间,取决于名称是否出现在全局中   同一代码块中的语句。如果名称未绑定,则为NameError   异常将被提出。

     

如果发生名称,则从本地名称空间中删除名称是违法的   作为嵌套块中的自由变量。

     

传递删除属性引用,订阅和切片   涉及的主要对象;通常删除切片   相当于分配一个正确类型的空切片(但是甚至   这是由切片的对象确定的。

source Python spec

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