首页 > 解决方案 > python代码仍在运行时如何释放内存?

问题描述

这是我的code.py

import numpy as np
import gc

def main():
    var_1, var_2, var_3 = np.random.normal(0, 1, (1, 3))[0]
    var_4, var_5, var_6 = np.random.normal(0, 1, (1, 3))[0]
    var_7, var_8, var_9 = np.random.normal(0, 1, (1, 3))[0]
    var_10, var_11, var_12 = np.random.normal(0, 1, (1, 3))[0]

    List = [var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12]
    with open('record.csv','a') as f: 
        for i in List:
            f.write('{},'.format(str(i)))
        f.write('\n')

    del var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12
    del f, List
    gc.collect()

# This code is just for demonstration. In actual 
# situation, `data` is necessary for main(). So don't use `del data`.
data = np.random.normal(0, 1, (1000, 3))

total = 100*100*100
for k in range(total):
    print(k+1, total)
    main()

从理论上讲,上面的代码应该只使用固定数量的内存,因为我已经删除了所有变量并清除了所有垃圾。但是,当我python code.py在一个终端中运行它并通过另一个终端观察内存使用情况htop时,内存使用情况不断增加,从1.79G/7.76Gto 1.80G/7.76G,然后 to1.81G/7.76G等等,直到 for 循环结束。

如何修改代码以使其继续运行而不会持续消耗更多内存?

标签: pythonmemory-managementgarbage-collection

解决方案


GC 不知道您的意图。操作系统一直在为 Python 进程分配内存,那么为什么还要清理垃圾呢?您需要以某种方式限制 Python 进程,让它知道可用的内存量。

看起来 Python 没有提供限制堆大小的方法。所以使用或操作系统特性来限制进程内存占用(即 ulimit 用于 linux 和 macos)。有关更多详细信息,请参阅此问题


推荐阅读