在我的python程序中,我使用pandas
来读取csv文件并存储在内存中:
data = pandas.read_csv('data.csv')
在运行上述命令之前,我使用free -m
检查空闲内存,输出为1704
。运行上述命令后,输出为729
。我跑
del(data)
释放data
使用的内存。现在,当我检查空闲内存时,输出为1093
,远小于原始1704
。其余的去哪儿了?我怎么能免费呢?我在ipython
中运行所有这些,甚至退出ipython也没有释放内存。
感谢。
答案 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 异常将被提出。
如果发生名称,则从本地名称空间中删除名称是违法的 作为嵌套块中的自由变量。
传递删除属性引用,订阅和切片 涉及的主要对象;通常删除切片 相当于分配一个正确类型的空切片(但是甚至 这是由切片的对象确定的。
你没有释放记忆。你告诉python你已经完成了这个变量。