Python:使用numpy数组时避免memoryerror的另一种方法吗?

时间:2017-06-04 17:54:29

标签: python numpy memory memory-management out-of-memory

我是python的新手,并开始使用numpy。我正在按照纸张算法和我的数据集,它需要一个维度为1百万* 1百万的数组。

确切代码为larray(np.random.normal(0, sigma**2, size=(794832, 794832))

虽然我有一个16GB的ram,numpy尝试在创建时将数组加载到内存中,因此,我得到memoryerror。我尝试使用lazyarray进行延迟初始化,但仍无效。

有没有办法创建一个使用文件系统而不是ram的数组?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您创建的数据大小取决于矩阵大小和数据的精确类型。

您正在尝试使用np.random.normal创建一个具有float64精度类型值的矩阵。 64号表示每个数字使用64位,因此每个数字需要8字节的存储器(每字节8位)。如果矩阵的形状/尺寸为4000x794832,则表示您需要~23.7GB [4000 * 794832 * 8]的内存分配。

如果你有一个16GB的RAM它应该是不够的,因为它将使用SWAP(如果定义足够的话)可能需要一些时间来创建它,或者只是耗尽内存。

问题是,你需要一个float64精度吗?因为它似乎对于通常的科学家发展很有用。因此,为了加速后续的数学运算,您可以考虑将矩阵精度类型更改为float16,例如[4000 * 794832 * 2]。

import numpy as np
a = np.random.normal(0, 0.7**2, size=(4000,794832))
a.nbytes   # will give a size of 25434624000 [~23.7GB] (huge number)
b = np.random.normal(0, 0.7**2, size=(4000,794832)).astype(np.float16)
b.nbytes   # will give a size of 6358656000 [~5.9GB](big but at least you can do everything on RAM)

这种情况的问题是np.random.normal没有选择直接定义numpy dtype,所以你将创建一个float64矩阵然后转换它,这不是一个非常有效的选项。但如果没有其他选择......