Cómo resolver el error de memoria de Python

En este artículo, quiero compartir cómo resolví los errores de memoria de Python cuando comencé a crear una aplicación.


¿Qué es el error de memoria?

Error de memoria de Python o, en términos simples, se ha quedado sin memoria en su RAM para ejecutar su código.

Cuando recibe este error, significa que ha cargado todos los datos en la memoria. Se recomienda el procesamiento por lotes para grandes conjuntos de datos. En lugar de cargar el conjunto de datos completo en la memoria, guárdelo en el disco duro y acceda a él en lotes.

El programa se ha quedado sin memoria, lo que produce un error de memoria. Esto indica que el software genera un número excesivo de elementos. En su caso, deberá buscar áreas de su algoritmo que estén tomando una cantidad significativa de RAM.

Se produce un error de memoria cuando una operación se queda sin memoria.

Tipos de error de memoria de Python

  • Los siguientes son los tipos de error de memoria de Python:
  • Error de memoria inesperado en Python
  • Error de memoria de Python debido al conjunto de datos
  • Error de memoria de Python debido a una instalación incorrecta de Python
  • Error de memoria insuficiente en Python
  • ¿Error de memoria en Python cuando 50 + GB está libre y usa Python de 64 bits?

1 - Error de memoria inesperado en Python

Si recibe un error de memoria de Python inesperado mientras tiene mucha RAM, es posible que esté ejecutando una instalación de Python de 32 bits.

Una solución simple al error inesperado de memoria de Python: Su software ha agotado todo el espacio de direcciones virtuales disponible. Lo más probable es que se deba a que está utilizando una versión de Python de 32 bits. Porque las aplicaciones de 32 bits están limitadas a 2 GB de espacio de direcciones en modo de usuario en Windows (y en la mayoría de los demás sistemas operativos).

Nosotros, los usuarios de Python abogamos por instalar una versión de 64 bits de Python (si es posible, actualice a Python 3 por otras razones); consumirá más memoria, pero también tendrá acceso a mucho más espacio de memoria (y también a más RAM física).

El problema es que Python de 32 bits tiene solo 4 GB de RAM. Debido a la sobrecarga del sistema operativo, esto puede disminuir aún más si su sistema operativo es de 32 bits.

 

2 - Error de memoria de Python debido al conjunto de datos

Otra opción, si está trabajando con un conjunto de datos enorme, es el tamaño del conjunto de datos, que se ha mencionado anteriormente en relación con las versiones de 32 bits y 64 bits. Cargar un enorme conjunto de datos en la memoria y ejecutar cálculos en él, así como preservar los resultados intermedios de dichos cálculos, puede consumir memoria rápidamente. Si este es el caso, las funciones del generador pueden ser muy útiles. Muchas bibliotecas de Python prominentes, como Keras y TensorFlow, incluyen métodos y clases de generación dedicados.

 

3 - Error de memoria de Python debido a una instalación incorrecta de Python

Los errores de memoria también pueden ser causados por una instalación incorrecta del paquete de Python. En realidad, antes de resolver el problema, habíamos instalado manualmente python 2.7 y los paquetes que necesito en Windows. Después de perder casi dos días tratando de averiguar qué estaba mal, recargamos todo usando Conda y el problema se resolvió.

Conda probablemente está instalando paquetes de administración de memoria mejorados, que es la causa principal. Por lo tanto, puede intentar instalar paquetes de Python usando Conda para ver si corrige el error de memoria.

 

4 - Error de memoria insuficiente en Python

Si un intento de asignar un bloque de memoria falla en la mayoría de los sistemas, se devuelve un "error de memoria insuficiente", sin embargo, la causa principal del problema casi nunca tiene nada que ver con estar "sin memoria". Esto se debe a que el administrador de memoria en casi todos los sistemas operativos modernos usará felizmente el espacio disponible en el disco duro para almacenar páginas de memoria que no caben en la RAM; el equipo normalmente puede asignar memoria hasta que el disco se llene, lo que puede provocar un error de memoria insuficiente de Python (o se alcanza un límite de intercambio; en Windows, consulte Propiedades del sistema > Opciones de rendimiento > Memoria virtual > avanzada).

Para empeorar las cosas, cada asignación actual en el espacio de direcciones del programa podría resultar en "fragmentación", lo que impide asignaciones adicionales al dividir la memoria disponible en trozos que son individualmente demasiado pequeños para satisfacer una nueva asignación con un solo bloque contiguo.

Cuando se opera en una versión de 64 bits de Windows, una aplicación de 32 bits con el indicador LARGEADDRESSAWARE habilitado tiene que acceder a los 4 GB de espacio de direcciones.

Cuatro lectores se han puesto en contacto para decir que la configuración gcAllowVeryLargeObjects elimina la restricción de .NET. No, no lo hace. Esta configuración permite que los objetos ocupen más de 2 GB de memoria, pero limita el número de elementos de una matriz unidimensional a 231 entradas.


¿Cómo puedo liberar memoria explícitamente en Python?

Si ha escrito un programa Python que utiliza un enorme archivo de entrada para generar unos pocos millones de objetos, y está utilizando mucha memoria, ¿cuál es el mejor enfoque para informar a Python que parte de los datos ya no son necesarios y pueden ser liberados?

Este problema tiene una solución simple:

Con gc.collect, puede forzar al recolector de elementos no utilizados a liberar una memoria sin referencia ().

Como se ilustra en el siguiente ejemplo:

import gc

gc.collect()


¿Error de memoria en Python cuando 50 + GB está libre y usa Python de 64 bits?

En algunos sistemas operativos, la cantidad de RAM que una sola CPU puede administrar es limitada. Por lo tanto, incluso si hay suficiente RAM disponible, su único subproceso (= ejecutándose en un núcleo) ya no podrá manejarlo. Pero no estoy seguro de si esto se aplica a su versión de Windows.

Cómo establecer límites en el uso de memoria y CPU

Para limitar el uso de memoria o CPU de un programa mientras se está ejecutando, de modo que no tengamos problemas de memoria, se puede utilizar el módulo "Resource" y ambas tareas se pueden completar con éxito, como se muestra en el siguiente código:


Código 1: Restringir el tiempo de 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


Código 02:  para restringir el uso de la memoria, el código pone un límite en el espacio total de direcciones


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


Formas de manejar errores de memoria en Python y archivos de datos grandes:

  • Asignar más memoria. 
  • Trabajar con una muestra más pequeña. 
  • Utilizar una computadora con más memoria. 
  • Utilizar una base de datos relacional. 
  • Utilizar una plataforma de Big Data. 

Conclusión: Así que esto es todo acerca de esta historia, en ella hemos cubierto muchas formas de manejar errores de memoria en Python.


Publicar un comentario

Hola

Articulo Anterior Articulo Siguiente