在具有足够内存的64位计算机上使用大型(500MB)阵列上的scipy.integrate.simps时出现内存错误

时间:2017-12-27 17:09:51

标签: python scipy out-of-memory simpsons-rule

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

出于某种原因,我在64位机器上的500MB浮动阵列上使用simps时出现内存错误,该机器有4GB可用内存。

以下是一些示例代码:

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,即使我没有使用所有可用内存。

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

我正在使用Winddows 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)中,内存消耗增加:

Memory Usage during experiment

0 个答案:

没有答案