如何解决 Python 内存错误

在本文中,我想分享我在开始构建应用程序时如何解决 python 内存错误。

什么是内存错误?
Python 内存错误,或者用外行的话来说,您的 RAM 中的内存已用完,无法运行您的代码。

当您收到此错误时,这意味着您已将所有数据加载到内存中。大数据集推荐使用批处理。与其将完整的数据集加载到内存中,不如将其保存到硬盘并分批访问。

您的程序内存不足,导致内存错误。这表明您的软件生成了过多的项目。在您的情况下,您需要寻找占用大量 RAM 的算法区域。

当操作耗尽内存时会发生内存错误。

Python 内存错误的类型

以下是 Python 内存错误的类型

  1. Python中的意外内存错误
  2. 由于数据集导致的 Python 内存错误
  3. Python 安装不当导致的 Python 内存错误
  4. Python中的内存不足错误
  5. 当 50+GB 可用并使用 64 位 python 时,Python 中的内存错误?

1 – Python 中的意外内存错误

如果您在拥有大量 RAM 时收到意外的 Python 内存错误,则您可能正在运行 32 位 Python 安装。

意外 Python 内存错误的简单解决方案:您的软件已用完所有可用的虚拟地址空间。这很可能是因为您使用的是 32 位 Python 版本。因为 32 位应用程序在 Windows(和大多数其他操作系统)中被限制为 2 GB 的用户模式地址空间。

我们 Python Poolers 提倡安装 64 位版本的 Python(如果可能,出于其他原因升级到 Python 3);它会消耗更多的内存,但它也可以访问更多的内存空间(以及更多的物理 RAM)。

问题是 32 位 Python 只有 4GB 的 RAM。由于操作系统开销,如果您的操作系统是 32 位,这可以减少更多。

2 – 由于数据集导致的 Python 内存错误

如果您正在处理一个巨大的数据集,另一个选择是数据集大小,之前已经提到过与 32 位和 64 位版本相关的内容。将庞大的数据集加载到内存中并在其上运行计算,以及保留此类计算的中间结果,会很快消耗内存。如果是这种情况,生成器函数会非常有用。许多著名的 Python 库,例如 Keras 和 TensorFlow,都包含专用的生成器方法和类。

3 – 由于 Python 安装不当导致的 Python 内存错误

不正确的 Python 包安装也可能导致内存错误。实际上,在解决问题之前,我们已经在 Windows 上手动安装了 python 2.7 和我需要的软件包。在浪费了将近两天的时间试图找出问题所在之后,我们使用 Conda 重新加载了所有内容,问题得到了解决。

Conda 可能正在安装改进的内存管理包,这是主要原因。因此,您可以尝试使用 Conda 安装 Python 包,看看它是否修复了内存错误。

4 – Python 中的内存不足错误

如果在大多数系统上分配内存块的尝试失败,则会返回“内存不足错误”,但是,问题的核心原因几乎与“内存不足”无关。这是因为几乎所有现代操作系统上的内存管理器都会愉快地使用您的可用硬盘空间来存储不适合 RAM 的内存页面。您的计算机通常可以分配内存,直到磁盘填满,这可能会导致 Python 内存不足错误(或达到交换限制;在 Windows 中,请参阅系统属性 > 性能选项 > 高级 > 虚拟内存)。

更糟糕的是,程序地址空间中的每个当前分配都可能导致“碎片化”,这会通过将可用内存分成块来阻止进一步的分配,这些块单独太小而无法满足单个连续块的新分配。

  • 在 64 位版本的 Windows 上运行时,启用 LARGEADDRESSAWARE 标志的 32 位应用程序必须访问整个 4GB 的地址空间。
  • 四位读者联系说 gcAllowVeryLargeObjects 设置消除了 .NET 限制。不,它没有。此设置允许对象占用超过 2GB 的内存,但它将一维数组中的元素数量限制为 231 个条目。

如何在 Python 中显式释放内存?

如果你编写了一个 Python 程序,它使用一个巨大的输入文件来生成几百万个对象,并且它占用了大量内存,那么通知 Python 部分数据不再需要并且可能被释放的最佳方法是什么?

这个问题有一个简单的解决方案:

使用gc.collect,您可以强制垃圾收集器释放未引用的内存 ()。

如下例所示:

import gc

gc.collect()

当 50+GB 可用并使用 64 位 python 时,Python 中的内存错误?

在某些操作系统上,单个 CPU 可以管理的 RAM 量是有限的。因此,即使有足够的 RAM 可用,您的单线程(=在一个内核上运行)也将无法再处理它。但我不确定这是否适用于您的 Windows 版本。

如何限制内存和 CPU 使用率

在程序执行时限制程序的内存或 CPU 使用。这样我们就没有任何记忆问题。为此,可以使用资源模块,并且两个任务都可以成功完成,如下面的代码所示:

Code1: 限制 CPU 时间

# importing libraries 
import signal 
import resource 
import os 
 
# checking time limit exceed 
def time_exceeded(signo, frame): 
    print("Time's up !") 
    raise SystemExit(1) 
 
def set_max_runtime(seconds): 
    # setting up the resource limit 
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU) 
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard)) 
    signal.signal(signal.SIGXCPU, time_exceeded) 
 
# max run time of 15 millisecond 
if __name__ == '__main__': 
    set_max_runtime(15) 
    while True: 
        pass

代码02: 为了限制内存使用,代码对总地址空间进行了限制

# using resource 
import resource 
 
def limit_memory(maxsize): 
    soft, hard = resource.getrlimit(resource.RLIMIT_AS) 
    resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard)) 

处理 Python 内存错误和大数据文件的方法

  • 分配更多内存
  • 使用较小的样本
  • 使用内存更大的计算机
  • 使用关系数据库
  • 使用大数据平台

结论

所以这就是这个故事的全部内容,在这个故事中,我们介绍了许多处理 python 内存错误的方法。

发表评论

邮箱地址不会被公开。 必填项已用*标注