0

我以向量化的方式使用 scipy simpsons 规则来提高性能。(我在时间序列的滚动窗口上计算积分。)

由于某种原因,在有 4GB 可用内存的 64 位机器上对 500MB 浮点数组使用 simps 时出现内存错误。

这是一些示例代码:

import numpy as np
from scipy.integrate import simps
import psutil

print(psutil.virtual_memory().percent)  #gives 40%
# in the followinging, the number of rows can be increased up until 190'000 without issues.
# The memory usage during execution of the whole script grows linearly with the size of the input array
# I don't observe any exponential behaviour in Memory-usage

a = np.random.rand(195000, 150, 2)  
print(psutil.virtual_memory().percent)  #gives 51%
print(a.nbytes/1024/1024, "MB")  #gives 446MB
print(a[:,:,0].nbytes/1024/1024, "MB")  #gives 223 MB
I = simps(a[:,:,0], a[:,:,1])  #MemoryError
print(psutil.virtual_memory().percent)

我可以看到我的机器的虚拟内存一直在上升,直到使用了 2GB,然后我得到了一个 MemoryError,即使我的空闲内存没有被使用。

所以我很困惑:即使仍有大约 2GB 的未使用内存可用,为什么我会收到 MemoryError?这可以解决吗?

我正在使用 Windows Server 2012 R2。

编辑:为了说明内存使用与输入大小的或多或少的线性缩放,我进行了以下小实验:

def test(rows):        
    a = np.random.rand(rows, 150, 2)
    I = simps(a[:,:,0], a[:,:,1])
    print(I.shape)

for numRows in [r for r in range(10000,190000,10000)]:
    test(numRows)

这使得 Windows 资源监视器以及其他工具(如 mprof)中的内存消耗增加:

实验期间的内存使用情况

4

0 回答 0