使用情形:

项目需要对多个大内存变量进行处理,但是每个大内存变量处理的时候都需要加载一个另外共同的大内存变量。现在处理完一个变量之后,只能重启kernel然后处理另一个变量;但是理论上我们可以删除一个变量的内存并读入下一个变量的内存代替。可以省下读取变量的时间

(1)含有变量顺序的原始代码
// An highlighted block
# index是每个变量处理时必须加载的索引

print('plot start!', time.strftime('%H:%M:%S', time.localtime()))
index = np.load('CH_var/plot/index/3_index.npy')
var = np.load('CH_var/plot/blh_day_value.npy', allow_pickle = True)    # blh需要重新计算
# var = np.load('CH_var/plot/e_day_value.npy', allow_pickle = True)
print('plot start!', time.strftime('%H:%M:%S', time.localtime()))

# 我们将每个变量的值映射到我们构建的栅格网中
var_year = np.zeros((365,xx.shape[0]), dtype = 'float32')
for i in tqdm(range(365)):
    var_year[i, index[i]] = var[i]
    var_year[i, ~index[i]] = np.nan

# 我们计算每个栅格的年均值
var_mean = np.zeros((xx.shape[0]))
for i in tqdm(range(xx.shape[0])):
    if var_year[:, i][~np.isnan(var_year[:, i])].size == 0:
        var_mean[i] = np.nan
    else:
        var_mean[i] = var_year[:, i][~np.isnan(var_year[:, i])].min()

# 将得到的变量保存为nc文件
a = xr.Dataset({'blh':(['lat', 'lon'], var_mean.reshape(X.shape))}, coords = {'lat': y, 'lon':x})
a.to_netcdf('output/blh_mean.nc')

(2)一般的流程

python删除变量并释放内存主要是三步:

del a;  import  gc;   gc.collect();

但是删除的时候发现,一套流程下来之后,服务器的内存占用并没有减少。于是开始寻找解决办法。遇事不决先百度,再google。(emm,那为什么不直接google呢)

(3)最后的解决

经过检索发现,gc.collect()无法释放内存占用的原因是:存在其他对象对该对象的引用

简单!!捋一下,我们的变量引用顺序是:var, var_year, var_mean, a。所以我们从尾开始依次删除变量,就可以抽丝剥茧删除变量的同时删除、该变量对其他变量的引用

开始的内存占用:
请添加图片描述
删除之后的内存占用:
请添加图片描述

(4)成功
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐