Python如何在循环状态下释放内存?

最近在学校GPU上用keras和sklearn跑深度学习的实验,然后被同学说自己的程序有问题,占用了太多服务器内存,导致别人的程序都没法启动。 思考了…
关注者
25
被浏览
69,165

7 个回答

试着把程序拆开执行,中间结果先保存,然后合并再执行下一步。

~~~~~~~~~~~~

这是你的原来的代码

for x in range(len(innerlayerlist)):
   for k in range(len(blocknumlist)):
       for i in range(len(batchsizelist)):
          TrainList = []
          TestList = []
          TrainList,TestList = core(curseedlist,trainData,TrainList,TestList,\
                   batchsizelist[i],blocknumlist[k],innerlayerlist[x])
          f=open(txtName, "a+")
          f.write(str(TrainList)+'\n'+str(TestList)+'\n\n')
          f.close()
          del TrainList
          del TestList
          del f

你把最内核的部分:

          TrainList = []
          TestList = []
          TrainList,TestList = core(curseedlist,trainData,TrainList,TestList,\
                   batchsizelist[i],blocknumlist[k],innerlayerlist[x])
          f=open(txtName, "a+")
          f.write(str(TrainList)+'\n'+str(TestList)+'\n\n')
          f.close()
          del TrainList
          del TestList
          del f

做成个单独的python函数。

前面加上命令行传参代码,入口参数就是batchsizelist[i],blocknumlist[k],innerlayerlist[x]具体的值。

你这个core函数看起来设计的不是很好:

curseedlist,trainData 这两个看起来永远不变,每次传进去没必要

,TrainList,TestList 这两个初值永远是 [],也没必要传进去

这两点可以优化下。

然后原来的程序改为多进程程序,我随便搜了个参考代码

(没错,我啥也记不住,整天抄代码,也抄自己的):

from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
    print 'Run child process %s (%s)...' % (name, os.getpid())
if __name__=='__main__':
    print 'Parent process %s.' % os.getpid()
    p = Process(target=run_proc, args=('test',))
    print 'Process will start.'
    p.start()
    p.join()
    print 'Process end.'

启动的子进程类似这样:

def run_proc(name):
    print 'Run child process %s (%s)...' % (name, os.getpid())

这样你的核心函数就是个单独进程执行,不断创建,销毁,不用管它怎么处理内存了。

效率肯定低一些,但能执行。

如果你的算法允许并行,可以把写文件改为写数据库,多个进程并发。

具体代码你应该能完成了。

CPython 是引用计数,还是单线程的,又不是Java的那种,你这里的这几个list用完就扔了,不会存在内存占用的问题,内存占用应该再别的地方。

另外,你这个代码是真的丑,我改一下:

for x in innerlayerlist: