【问题标题】:Getting memory error in Python 3.8, using spider as my IDE在 Python 3.8 中出现内存错误,使用 spider 作为我的 IDE
【发布时间】:2022-11-22 01:11:53
【问题描述】:

我正在尝试运行一个程序,该程序涉及将两个大小为 69496 乘以 511 的大型二进制 NumPy 数组相乘。我的数组是二进制的,我使用 Spyder 作为我的 IDE。

这是我的代码:

import numpy as np
import math
import re

def ip(A):
    B=A.transpose()
    C = np.dot(A, B)
    [a, b] = C.shape
    D=[]
    for i in range (a):
        print(i)
        for j in range (i+1, a):
            c= C[i, j]
            D.append(c)
    return(D)

因此,我提供给函数的输入“o”是一个大小为 69496 乘以 511 的二进制 NumPy 数组。

D = IP(o)

但是,我收到以下内存错误:

MemoryError: Unable to allocate 36.0 GiB for an array with shape (69496, 69496) and data type float64

我有 16 GB RAM,我有 Windows 11。有人可以给我建议如何解决这个问题吗?

【问题讨论】:

  • 首先,我非常怀疑您的数组实际上是二进制或布尔值。错误消息显示 float64。
  • @水星;是的,错误消息说它是 float64,但是我的输入数组只包含 0 和 1。你能告诉我如何将 float 类型的数据转换为二进制数据吗?
  • 你可以用astype将它转换成你想要的类型,比如o.astype(np.bool)
  • @Mercury:我试过 o.astype(np.bool),但我遇到了同样的错误。
  • 可能是因为阵列仍然太大。 A 和 A.T 之间的点积本身应该首先复制 A,然后需要为内部 matmul 分配大量内存并存储 (69496, 69496) 输出(这本身将近 5GB)。您可能需要一个更有效的算法——就像我可以很容易地告诉您正在寻找 A 的自内积的上三角一样,所以您可能不需要在这里进行完整的点积。

标签: python python-3.x numpy numpy-ndarray


【解决方案1】:

你真正想要的是这个功能: 你不需要计算 a x aT,因为你有巨大的矩阵,它最终需要大内存。您可以将 dtype 设置为 uint16 ,但无论如何最终大小仍然很大(因为您有大量的行)

def ip(a):
    m, n = a.shape
    c = []
    for i in range(m):
            c.extend(np.dot(a[i + 1:], a[i]).tolist())
    return c

像这样写将有助于不使用大内存,但我的建议是返回 numpy 数组,不明白为什么你存储为列表,但我保留了你想要的输出。

输出为 numpy 数组:

def ip(a):
    m, n = a.shape
    c = np.zeros(sum(range(m)), dtype=np.uint16)
    offset = ((np.arange(m - 1) * m) - np.cumsum(np.arange(m - 1) ))
    for i, off_set in enumerate(offset):
        c[off_set: off_set + m - i - 1] = np.dot(a[i + 1:], a[i])
    return c

PS:请注意,即使您的数据是 uint8(如您所述),您的输出也可能是 16 位,因为列数超过 256。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2019-02-11
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多