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.