6

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

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

在运行上述命令之前,我检查了可用内存,free -m输出为1704. 运行上述命令后,输出为729. 我跑

del(data)

释放所使用的内存data。现在,当我检查可用内存时,输出1093比原来的要少得多1704。其余的去哪儿了?我怎样才能释放它?我正在运行所有这些ipython,即使退出 ipython 也不会释放内存。

谢谢。

4

2 回答 2

15

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

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

cat /proc/meminfo

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

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

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

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

无论如何,操作系统都会缓存文件内容,因此当您再次尝试读取同一个文件时,它不必进行冗余磁盘读取。

于 2016-02-01T01:32:40.100 回答
5

del不是 Cfree或 C++ 的delete

6.5。del 语句

del_stmt ::= "del" target_list

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

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

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

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

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

源 Python 规范

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

于 2016-02-01T01:34:03.927 回答