Numpy / Scipy:每次迭代的内存消耗呈线性增加

时间:2019-10-03 10:28:56

标签: python numpy scipy

运行以下代码时:

import numpy as np
import scipy.sparse
import time

def test():
    m = 10000
    n = 10000 
    for i in range(5):
        A = scipy.sparse.random(m, n, density=0.1, format='csr')
        x = np.random.randn(n)
        Ax = A.dot(x)
        time.sleep(2)

if __name__ == "__main__":
    test()

我观察到内存消耗线性增加到> 4.8Gb!

我再次使用以下功能进行了测试:

def test2():
    m = 10000
    n = 10000
    for i in range(5):
        print(i)
        A = np.random.rand(m, n)
        x = np.random.randn(A.shape[1])
        Ax = A.dot(x)
        time.sleep(2)

内存消耗线性增加到> 800Mb。

我有两个问题:

  1. 为什么每种情况下的内存消耗都呈线性增加?每次迭代都没有声明新的变量...

  2. 考虑到矩阵稀疏(密度仅为0.1),为什么在第一次测试中内存消耗比第二次测试高得多?

预先感谢您的回答!

1 个答案:

答案 0 :(得分:1)

1。 由于您所有的变量声明都在未嵌套的for...循环中,因此它们会在每次迭代中重新运行,每行对总内存贡献不同的线性增量(O(n))用法。同样,由于在迭代之后没有像delete operation这样的释放内存的操作,因此内存使用量会比以前的迭代增加。 以下是def test()

的内存配置文件的结果
|Line|  |Mem usage|    |Increment|   |Line Contents|
-----------------------------------------------------
     5   1844.9 MiB   1844.9 MiB   def test():
     6   1844.9 MiB      0.0 MiB       m = 10000
     7   1844.9 MiB      0.0 MiB       n = 10000 
     8   4518.7 MiB      0.0 MiB       for i in range(5):
     9   4518.7 MiB    763.7 MiB           A = scipy.sparse.random(m, n, density=0.1, format='csr')
    10   4518.7 MiB      0.0 MiB           x = np.random.randn(n)
    11   4518.7 MiB      0.0 MiB           Ax = A.dot(x)
    12   4518.7 MiB      0.0 MiB           time.sleep(2)
  1. 我将这两个函数占用的内存的差异归因于以下事实:与scipy相比,numpy数据结构的优化程度更高,即它们占用的空间更少。