【问题标题】:Python: Alternative way to avoid memoryerror when using numpy array?Python:使用 numpy 数组时避免内存错误的替代方法?
【发布时间】:2017-11-05 12:44:07
【问题描述】:

我是 python 新手,开始使用 numpy。我正在遵循纸上的算法,我的数据集需要一个维度为 100 万 * 100 万的数组。

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

虽然我有 16GB 内存,但 numpy 会在创建时尝试将数组加载到内存中,因此我得到了 memoryerror。我尝试使用 lazyarray 进行延迟初始化,但仍然无法正常工作。

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

提前致谢。

【问题讨论】:

  • 您需要超过 4 TB 的 RAM。我认为您没有足够的交换空间。
  • 您不可能在消费级 PC 上存储包含一万亿个元素的数组。即使您使用辅助内存,您也需要一个 TB 级硬盘。你实际上想用 10^6 x 10^6 数组做什么?这可能是 XY 问题
  • @clockwatcher 即使您在硬盘上存储了万亿元素数组,您也需要 TB 的存储空间。压缩也无济于事,因为它是随机数据。
  • 感谢大家的评论。我忘了提到我是数据科学领域的新手,我有一个来自 db 的数据。另外,我在维度上犯了一个错误。它是4000 * 794832。我还需要 TB 空间吗?

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


【解决方案1】:

您正在创建的数据的大小将取决于矩阵大小和数据的精度类型。

您正在尝试使用 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矩阵然后转换它,这不是一个非常有效的选择。但如果没有其他选择...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2017-02-02
    • 2013-03-28
    相关资源
    最近更新 更多