【问题标题】:How to release memory when python code is still in running?python代码仍在运行时如何释放内存?
【发布时间】:2019-08-01 03:42:29
【问题描述】:

这是我的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.76G 增加到1.80G/7.76G,然后到1.81G/7.76G 等等直到-循环结束。

如何修改代码以使其在不持续消耗更多内存的情况下继续运行?

【问题讨论】:

  • 在这里使用del 完全没有意义,gc 也是如此。这些都是局部变量,没有引用循环供gc处理。
  • 实际上,这是 Python 2 吗?
  • 是的,python -V 显示它是 python 2.7.12
  • Python2 没有垃圾回收??
  • 还在等待答复!

标签: python memory-management garbage-collection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正如评论者所说,del 和 gc 是不必要的,因为 Python 对变量的作用域是这样的。我还看到这样的打印语句在某些机器上占用了大量系统资源。我没有保留您的功能结构,但这里有两个解决方案。如果您不知道输出数组的大小,请执行以下操作:

    total = 100*100*100
    out = []
    for i in range(total):
        if i % 1e5 == 0:
            print(i, total)
        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]
    
        out.append([var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12])
    
    np.savetxt('SOcheck.dat', out, delimiter=',')
    

    在我的运行 python 3.6.3 并使用 iPython 的 Windows 10 机器上,该代码永远不会超过大约 400M 的内存。如果您知道输出数组的大小并首先保留内存,您将获得显着的节省(内存使用量降至约 270M),如下所示:

    total = 100*100*100
    out = np.empty((total, 12), dtype=np.ndarray)
    for i in range(total):
        if i % 1e5 == 0:
            print(i, total)
        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]
    
        out[i] = [var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12]
    
    np.savetxt('SOcheck.dat', out, delimiter=',')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多