python.exe在创建numpy数组时被压碎

时间:2014-04-15 10:13:38

标签: python python-2.7 memory numpy

我试图在x32机器上执行此代码

rows=100000
cols=1000

def create_matrix(rows,cols):
    data = (np.random.rand(rows,cols)*100).astype('uint8')
    return data

但是python.exe被粉碎了,是什么原因? (我认为它不是x32内存绑定的?因为这样的数组只需要~100 mb)。

1 个答案:

答案 0 :(得分:3)

最终输出大约需要100 MB。但是,最终输出不是您分配的唯一数组。

np.random.rand(rows,cols)

这是一个包含1亿个float64的数组。它需要大约800 MB。

np.random.rand(rows,cols)*100

这是另一个包含1亿个float64的数组。它还需要大约800 MB。在计算时,此阵列和前一个阵列都必须保留在内存中,峰值内存使用量约为1.6 GB,比您预期的高16倍。

NumPy似乎没有提供直接生成随机uint8的方法。但是,通过使用numpy.random.randint生成int32s而不是float64s并跳过临时分配,可以将此函数的峰值内存使用率降低到约500 MB:

return np.random.randint(0, 100, (rows, cols)).astype('uint8')

如果仍然太高,你可以在块中生成随机数并切片 - 将它们分配到结果数组中,从而减少需要在内存中保留的临时int32的数量:

data = np.zeros([rows, cols], dtype='uint8')
for chunk_start in xrange(0, rows, rows/10):
    data[chunk_start: chunk_start+rows/10] = (
            np.random.randint(0, 100, (rows/10, cols)))
return data

此版本的峰值内存使用量应约为140 MB。