python del 没有释放所有内存

python del not freeing all the memory

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

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

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

del(data)

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

谢谢。

"Exiting ipython doesn't free up that memory" 表示您看到的是 OS 级别的效果。您可能看到了内存缓存的效果。该数据保存在内存中,直到需要 space 或再次读取文件 - 不是从磁盘读取文件,而是从内存的 'inactive' 部分读取。

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

cat /proc/meminfo

您的可用内存为空闲 + 非活动。 Free 现已可用,OS 将根据需要从 Inactive 中回收 space。我保留以下别名(在 csh 中)以检查

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

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

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

尽管如此,OS 仍会将文件内容缓存起来,这样当您再次尝试读取同一文件时,它就不必进行冗余磁盘读取。

del 不是 C 的 free 或 C++ 的 delete

6.5. The del statement

del_stmt ::= "del" target_list

Deletion is recursively defined very similar to the way assignment is defined. Rather than spelling it out in full details, here are some hints.

Deletion of a target list recursively deletes each target, from left to right.

Deletion of a name removes the binding of that name from the local or global namespace, depending on whether the name occurs in a global statement in the same code block. If the name is unbound, a NameError exception will be raised.

It is illegal to delete a name from the local namespace if it occurs as a free variable in a nested block.

Deletion of attribute references, subscriptions and slicings is passed to the primary object involved; deletion of a slicing is in general equivalent to assignment of an empty slice of the right type (but even this is determined by the sliced object).

source Python spec

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