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).
您没有释放内存。你告诉 python 你已经完成了那个变量。
在我的 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).
您没有释放内存。你告诉 python 你已经完成了那个变量。