我是 python 新手,开始使用 numpy。我遵循论文中的算法,并且使用我的数据集,它需要一个维度为 100 万 * 100 万的数组。
确切的代码是larray(np.random.normal(0, sigma**2, size=(794832, 794832))
虽然我有 16GB 内存,但 numpy 会在创建时尝试将数组加载到内存中,因此,我收到内存错误
。我尝试使用 lazyarray
进行延迟初始化,但仍然无法正常工作。
有没有办法创建一个使用文件系统而不是内存的数组?
提前致谢。
最佳答案
您创建的数据的大小取决于矩阵大小和数据的精度类型。
您正在尝试使用 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 矩阵,然后进行转换它,这不是一个非常有效的选择。但如果没有其他选择...
关于Python:使用 numpy 数组时避免内存错误的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44357145/