我有大量的数据文件,从一个数据文件加载的每一个数据都会被重新采样数百次,并通过几种方法进行处理。我用numpy
来做这个。我面临的是运行程序数小时后出现的内存错误。由于每个数据都是单独处理的,并且结果使用scipy.savemat
存储在.mat
文件中,所以我认为可以释放以前数据使用的内存,所以我使用了del variable_name
+gc.collect()
,但这不起作用。然后我使用了multiprocessing
模块,正如在this post和{a2}中建议的那样,它仍然不能工作。在
以下是我的主要代码:
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()
这是我最初的做法。我把file_lists
分成7个部分,运行了7个python屏幕,因为我的计算机有8个CPU核。如果我这样做的话,在MATLAB中没有问题。我不会为每个数据处理方法组合ixs
的迭代,因为可能会发生内存错误,所以我运行resample_from_data
并分别保存结果。由于内存错误仍然存在,我将Pool
类用作:
它在file_lists
上运行迭代,并将file_lists
中的文件名作为输入并行化。在
所有代码在openSuSE
中运行,其中python 2.7.5
、8 cores CPU
和{top
来监视所使用的内存。所有的矩阵都不是那么大,如果我使用所有代码运行任何一个加载的数据都可以。但是在file_lists
上经过几次迭代之后,可用内存急剧下降。我确信这种现象不是由数据本身引起的,因为即使是处理最大的数据矩阵,也不应该使用如此大的内存。所以我怀疑,我试图释放之前处理数据和存储处理结果所使用的内存的上述方法并没有真正释放内存。在
有什么建议吗?在
这可能会有所帮助,gc.收集()
一旦循环结束,
del
显式地释放所有变量。后来我不认为他们是你的问题。我认为您的机器很可能无法处理7个线程(在最坏的情况下)7个线程同时执行data = scio.loadmat(f)
。你可以试着用锁将这个呼叫标记为一个关键部分。在相关问题 更多 >
编程相关推荐