我是python的新手,并开始使用numpy。我正在按照纸张算法和我的数据集,它需要一个维度为1百万* 1百万的数组。
确切代码为larray(np.random.normal(0, sigma**2, size=(794832, 794832))
虽然我有一个16GB的ram,numpy尝试在创建时将数组加载到内存中,因此,我得到memoryerror
。我尝试使用lazyarray
进行延迟初始化,但仍无效。
有没有办法创建一个使用文件系统而不是ram的数组?
提前致谢。
答案 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矩阵然后转换它,这不是一个非常有效的选项。但如果没有其他选择......