【问题标题】:Memory management in python loopspython循环中的内存管理
【发布时间】:2021-07-01 12:33:12
【问题描述】:

我有一个要求,我需要以梯形方式循环。它看起来像这样。

for i in [i1,i2,.....]:
    for j in [j1,j2,.....]:
        for k in [k1,k2,.....]:
            for l in [l1,l2,.....]:
                for m in [m1,m2,.....]:
                        loop_variables = some computation on i,j,k,l,m
                        np.save('matrix.npy',loop_variables)

这段代码让我的笔记本电脑死机了。所以,我使用itertoolsdelgc的方式如下。

import itertools
import gc
i = [i1,i2,.....]
j = [j1,j2,.....]
k = [k1,k2,.....]
l = [l1,l2,.....]
m = [m1,m2,.....]
lst = [i,j,k,l,m]
f_lst = itertools.product(*lst)
del i,j,k,l,m, lst
for i,j,k,l,m in f_lst:
    loop_variables = some computation on i,j,k,l,m
    np.save('matrix.npy',loop_variables)
    del loop_variables, i,j,k,l,m
    gc.collect()

但问题仍然存在。我有以下问题

  1. 上面的代码在解决梯形循环方面是否更好
  2. 我应该如何更改上面的代码,使其在一定时间后不会冻结。

【问题讨论】:

    标签: python memory memory-management memory-leaks garbage-collection


    【解决方案1】:

    每次打开文件都会产生费用。

    一般来说,在内循环中使用多少 CPU 与为减少 CPU 使用而消耗多少 RAM 之间需要权衡取舍。即您是否收集结果并稍后写出(并且可能在收集时耗尽内存)。

    以下是您示例的修剪版本的 jupyter 笔记本结果。使用 'with' 的速度大大提高。

    import numpy as np
    import os
    
    %%timeit
    try:
        os.remove('a.npy')
    except:
        pass
    for i in range(10):
        for j in range(10):
            x = np.arange(10)
            np.save('a.npy', x)
    # 36 ms ± 746 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %%timeit
    try:
        os.remove('b.npy')
    except:
        pass
    with open('b.npy', 'wb') as f:
        for i in range(10):
            for j in range(10):
                x = np.arange(10)
                np.save(f, x)
    # 11.9 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    编辑:numpy doc 表示保存附加,但是“a.npy”和“b.npy”的大小不同,所以......我不相信“a.npy”。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2017-10-10
      • 2017-08-29
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多