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

2024-10-02 18:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大量的数据文件,从一个数据文件加载的每一个数据都会被重新采样数百次,并通过几种方法进行处理。我用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类用作:

^{pr2}$

它在file_lists上运行迭代,并将file_lists中的文件名作为输入并行化。在

所有代码在openSuSE中运行,其中python 2.7.58 cores CPU和{}。我使用top来监视所使用的内存。所有的矩阵都不是那么大,如果我使用所有代码运行任何一个加载的数据都可以。但是在file_lists上经过几次迭代之后,可用内存急剧下降。我确信这种现象不是由数据本身引起的,因为即使是处理最大的数据矩阵,也不应该使用如此大的内存。所以我怀疑,我试图释放之前处理数据和存储处理结果所使用的内存的上述方法并没有真正释放内存。在

有什么建议吗?在


Tags: keyfromorgnormautodatalsgc
2条回答

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

一旦循环结束,del显式地释放所有变量。后来我不认为他们是你的问题。我认为您的机器很可能无法处理7个线程(在最坏的情况下)7个线程同时执行data = scio.loadmat(f)。你可以试着用锁将这个呼叫标记为一个关键部分。在

相关问题 更多 >