我有大量数据文件,从数据文件加载的每个数据都会重新采样数百次,并通过多种方法处理。我用numpy
来做这件事。我面临的是几个小时后运行程序时的内存错误。由于每个数据都是单独处理的,并且结果使用.mat
存储在scipy.savemat
文件中,我认为之前数据使用的内存可以释放,因此我使用del variable_name
+ {{1但是这不起作用。然后我按照this post和this 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
openSuSE
,python 2.7.5
和8 cores CPU
内投放。我使用32G RAM
来监控使用的内存。所有矩阵都不是很大,如果我使用所有代码运行任何一个加载的数据,那就没问题了。但经过top
几次迭代后,可用内存急剧下降。我确信这种现象不是由数据本身引起的,因为即使最大的数据矩阵正在处理中也不应该使用这么大的内存。所以我怀疑上述方法我尝试释放处理以前数据所使用的内存以及存储处理结果并没有真正释放内存。
有什么建议吗?
答案 0 :(得分:0)
循环结束后,del
显式的所有变量都会自动释放。随后我不认为他们是你的问题。我认为你的机器更有可能无法处理7个线程(最坏的情况)7同时执行data = scio.loadmat(f)
。您可以尝试将该调用标记为具有锁定的关键部分。
答案 1 :(得分:-3)
这可能会有所帮助,gc.collect()