我试图在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)。
答案 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。