如何在python中有效释放内存?

时间:2017-01-16 10:19:50

标签: python matlab numpy

我有大量数据文件,从数据文件加载的每个数据都会重新采样数百次,并通过多种方法处理。我用numpy来做这件事。我面临的是几个小时后运行程序时的内存错误。由于每个数据都是单独处理的,并且结果使用.mat存储在scipy.savemat文件中,我认为之前数据使用的内存可以释放,因此我使用del variable_name + {{1但是这不起作用。然后我按照this postthis post中的建议使用了gc.collect()模块,它仍无效。

以下是我的主要代码:

multiprocessing

这是我做过的最初方式。我将import scipy.io as scio import gc from multiprocessing import Pool def dataprocess_session: i = -1 for f in file_lists: i += 1 data = scio.loadmat(f) ixs = data['rm_ix'] # resample indices del data gc.collect() data = scio.loadmat('xd%d.mat'%i) # this is the data, and indices in "ixs" is used to resample subdata from this data j = -1 mvs_ls_org = {} # preallocate results files as dictionaries, as required by scipy.savemat. mvs_ls_norm = {} mvs_ls_auto = {} for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data,ix) mvs_ls_org[key] = process(X) scio.savemat('d%d_ls_org.mat'%i,mvs_ls_org) del mvs_ls_org gc.collect() j = -1 for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data,ix) X2 = scale(X.copy(), 'norm') mvs_ls_norm[key] = process(X2) scio.savemat('d%d_ls_norm.mat'%i,mvs_ls_norm) del mvs_ls_norm gc.collect() j = -1 for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data,ix) X2 = scale(X.copy(), 'auto') mvs_ls_auto[key] = process(X2) scio.savemat('d%d_ls_auto.mat'%i,mvs_ls_auto) del mvs_ls_auto gc.collect() # use another method to process data j = -1 mvs_fcm_org = {} # also preallocate variable for storing results mvs_fcm_norm = {} mvs_fcm_auto = {} for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data['X'].copy(), ix) dp, _ = process_2(X.copy()) mvs_fcm_org[key] = dp scio.savemat('d%d_fcm_org.mat'%i,mvs_fcm_org) del mvs_fcm_org gc.collect() j = -1 for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data['X'].copy(), ix) X2 = scale(X.copy(), 'norm') dp, _ = process_2(X2.copy()) mvs_fcm_norm[key] = dp scio.savemat('d%d_fcm_norm.mat'%i,mvs_fcm_norm) del mvs_fcm_norm gc.collect() j = -1 for ix in ixs: j += 1 key = 'name%d'%j X = resample_from_data(data['X'].copy(), ix) X2 = scale(X.copy(), 'auto') dp, _ = process_2(X2.copy()) mvs_fcm_auto[key] = dp scio.savemat('d%d_fcm_auto.mat'%i,mvs_fcm_auto) del mvs_fcm_auto gc.collect() 拆分为7个部分,然后运行7个python屏幕,因为我的计算机有8个CPU核心。 如果我这样做,在MATLAB中没问题。我没有为每个数据处理方法组合file_lists的迭代,因为可能发生内存错误,所以我运行了ixs并分别保存结果。由于内存错误仍然存​​在,我使用resample_from_data类作为:

Pool

运行pool = Pool(processes=7) pool.map(dataprocess_session_2, file_lists) 上的迭代,并使用file_lists中的文件名作为输入。

所有代码均在file_lists openSuSEpython 2.7.58 cores CPU内投放。我使用32G RAM来监控使用的内存。所有矩阵都不是很大,如果我使用所有代码运行任何一个加载的数据,那就没问题了。但经过top几次迭代后,可用内存急剧下降。我确信这种现象不是由数据本身引起的,因为即使最大的数据矩阵正在处理中也不应该使用这么大的内存。所以我怀疑上述方法我尝试释放处理以前数据所使用的内存以及存储处理结果并没有真正释放内存。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

循环结束后,del显式的所有变量都会自动释放。随后我不认为他们是你的问题。我认为你的机器更有可能无法处理7个线程(最坏的情况)7同时执行data = scio.loadmat(f)。您可以尝试将该调用标记为具有锁定的关键部分。

答案 1 :(得分:-3)

这可能会有所帮助,gc.collect()