运行以下代码时:
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。
我有两个问题:
为什么每种情况下的内存消耗都呈线性增加?每次迭代都没有声明新的变量...
考虑到矩阵稀疏(密度仅为0.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)