<p>我有大量的数据文件,从一个数据文件加载的每一个数据都会被重新采样数百次,并通过几种方法进行处理。我用<code>numpy</code>来做这个。我面临的是运行程序数小时后出现的内存错误。由于每个数据都是单独处理的,并且结果使用<code>scipy.savemat</code>存储在<code>.mat</code>文件中,所以我认为可以释放以前数据使用的内存,所以我使用了<code>del variable_name</code>+<code>gc.collect()</code>,但这不起作用。然后我使用了<code>multiprocessing</code>模块,正如在<a href="https://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python">this post</a>和{a2}中建议的那样,它仍然不能工作。在</p>
<p>以下是我的主要代码:</p>
<pre><code>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()
</code></pre>
<p>这是我最初的做法。我把<code>file_lists</code>分成7个部分,运行了7个python屏幕,因为我的计算机有8个CPU核。<strong>如果我这样做的话,在MATLAB中没有问题。</strong>我不会为每个数据处理方法组合<code>ixs</code>的迭代,因为可能会发生内存错误,所以我运行<code>resample_from_data</code>并分别保存结果。由于内存错误仍然存在,我将<code>Pool</code>类用作:</p>
^{pr2}$
<p>它在<code>file_lists</code>上运行迭代,并将<code>file_lists</code>中的文件名作为输入并行化。在</p>
<p>所有代码在<code>openSuSE</code>中运行,其中<code>python 2.7.5</code>、<code>8 cores CPU</code>和{<cd16>}。我使用<code>top</code>来监视所使用的内存。所有的矩阵都不是那么大,如果我使用所有代码运行任何一个加载的数据都可以。但是在<code>file_lists</code>上经过几次迭代之后,可用内存急剧下降。我确信这种现象不是由数据本身引起的,因为即使是处理最大的数据矩阵,也不应该使用如此大的内存。所以我怀疑,我试图释放之前处理数据和存储处理结果所使用的内存的上述方法并没有真正释放内存。在</p>
<p>有什么建议吗?在</p>