Python:使用 numpy 数组时避免内存错误的替代方法?

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

我是 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/

相关文章:

python - 按整数访问行,按标签访问列 Pandas

Python 在滚动窗口中对多个数据数组进行操作

python - 打印矩阵中值的位置 MATRIX

VS2013内存窗口中的内存1、内存2、内存3、内存4

java - 在java中,静态方法返回后对象会发生什么

memory - 如何在 x86 汇编中以保护模式在屏幕上绘制像素?

python - 如何对图中每一行的 Y 轴标签进行不同的排序?

python 正则表达式分隔字符串的元素

python - 为什么 sum 在我导入 NumPy 后表现不同

python - 如何查找嵌套在另一个数组中的数组的索引?