【问题标题】:Python MemoryError on large array大型数组上的 Python MemoryError
【发布时间】:2017-10-18 18:59:50
【问题描述】:

这是我正在尝试运行的 python 脚本:

n = 50000000000 ##50 billion 
b = [0]*n
for x in range(0,n):
    b[x] = random.randint(1,899999)

...但是我得到的输出是:

E:\python\> python sort.py
Traceback (most recent call last):
  File "E:\python\sort.py", line 8, in <module>
    b = [0]*n
MemoryError

那么,我现在该怎么办?

【问题讨论】:

  • 您的内存不足。错误消息是这样说的。
  • 你正在尝试分配一个 40GB 的数组
  • int 至少占用 24 个字节;你有 5,000,000,000 ints。那是 111GB。
  • 如果您解释一下您打算如何处理这么多随机数,也许会更有用。几乎可以肯定有一种方法可以做到这一点而不会耗尽你的记忆。
  • @litelite 不,int 是 Python 对象,表示任意精度的整数,而不是机器字。

标签: python memory


【解决方案1】:

您正在生成的列表的大小(500 亿而不是 5)。

int 对象实例占用 24 个字节(sys.getsizeof(int(899999)),您的随机数的上限),因此该列表将占用 50,000,000,000 * 24 bytes,约为 1.09 TB。 p>

换句话说,要创建这样一个列表,您的计算机至少需要 1118 GB 的 RAM

我不知道你的用例是什么,但你应该考虑一种不同的方法来解决你想要解决的问题(也许定义一个generator,或者只是不要将你的数字存储在内存中,而是直接使用for 循环中的数字)。

【讨论】:

  • 这实际上是一个下限。最小的 int 占用那么多内存,但 int 对象占用可变数量的内存,例如sys.getsizeof(1000000000000000000) == 32,而sys.getsizeof(1000) == 28
  • @juanpa.arrivillaga 在作者的问题中,最大可达到的数字是 899999,并且从 0 到该数字的 int 对象的大小都是 24 字节。 (我更新了答案以显示这个上限是如何计算的)
  • 我的系统上有 28 个... 64bit python 3.5, Mac OSX
  • 与 Python 2 相比,Python 3 显然多了 4 个字节的开销
  • 另外,为了继续深入,我们只讨论了int 对象本身所需的内存。 list 是另外 64 个字节加上 50,000,000,000 个指针(4-8 个字节,取决于您的架构)来引用每个 int 对象。
【解决方案2】:

由于其他人已经回答了您的问题,这里有一个处理大数字时的快速提示:您可以根据需要使用“_”分隔数字的数字:

n = 50_000_000_000

一样
n = 50000000000

但前者对眼睛更容易

【讨论】:

    【解决方案3】:

    另一种可能性是增加您的计算机虚拟内存。它在我的代码中帮助了我。我有一个最大 3000MB 的虚拟内存,当我将它增加到 5000MB 时,内存错误就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多