【问题标题】:Automatically freeing memory of no more used variables in python自动释放python中不再使用的变量的内存
【发布时间】:2020-03-19 14:49:08
【问题描述】:

我是 Python 新手。 假设,我使用大熊猫数据框。 我的代码看起来像:

all_data = pd.read_csv(huge_file_name)
part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
data_filtered = part_data.loc[:,part_data['ColumnName2']==-1]

等等。 是某种方式,python 可以删除 all_data、part_data 和其他不再使用的变量吗? 我可以写del var_name,但它会使代码变得很脏。 我也可以为所有变量使用相同的名称,但它看起来也不好看。 提前谢谢大家!

【问题讨论】:

标签: python pandas memory del


【解决方案1】:

del 关键字就是这样做的方法;我不确定您对使代码“脏”的担忧有很多事情要做。 Python 人喜欢说explicit is better than implicit,这就是一个例子。

否则,在函数范围内声明中间变量,当函数终止时,这些变量使用的空间将被释放(或者更确切地说,标记为“垃圾收集”;见下文)。

所以你可以:

import gc

all_data = pd.read_csv(huge_file_name)
part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
data_filtered = part_data.loc[:,part_data['ColumnName2']==-1]

del all_data, part_data

# and if you're impatient for that memory to be freed, like RIGHT now
gc.collect()

或者你可以:

import gc

def filter_data(infile):
    all_data = pd.read_csv(infile)
    part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
    return part_data.loc[:,part_data['ColumnName2']==-1]

data_filtered = filter_data(huge_file_name)

# force out-of-scope variables to be garbage collected RIGHT now
gc.collect()

del 关键字从本地范围释放变量,以便(最终)对其进行垃圾回收,但是当变量超出范围时释放的内存可能不会立即返回给操作系统。 The SO threadAMC 有帮助地指出你有细节。

垃圾收集策略是博士级计算机科学的东西,但我的直觉是,只有在 Python 运行时存在释放一些内存的“压力”时才会触发 GC;例如,新的变量声明需要使用一些以前被超出范围的变量使用的内存。

您小心地指出这是一个被读入单个 (Pandas) 数据结构的大型 CSV 文件,但请注意,超出范围的变量通常会自动被垃圾收集,并且 通常不需要自己对这个过程进行微观管理

Here 是有关 Python 垃圾收集的一些背景知识,您可能会发现它很有启发性,here 是对 del 有用的其他时间的讨论(例如,从列表中删除切片)。

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 2014-04-30
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多