Pérdida de memoria en Python

Rana Hasnain Khan 15 febrero 2024
  1. Pérdida de memoria en Python
  2. Identificar pérdida de memoria en Python
  3. Reparar pérdida de memoria en Python
Pérdida de memoria en Python

Las fugas de memoria son un problema de programación común que puede ser difícil de depurar y corregir.

Este artículo explorará la pérdida de memoria de Python con programas de ejemplo pequeños y más grandes. Veremos cómo encontrar el origen de la fuga de memoria y cómo solucionarlo.

Pérdida de memoria en Python

No discutiremos las partes internas del sistema de administración de memoria de Python en este artículo. Pero, si tiene curiosidad acerca de cómo funciona el sistema de memoria de Python, puede consultar el código fuente de la biblioteca estándar de Python y el código de otros lenguajes de programación de alto nivel.

Ahora, analicemos algunas bibliotecas que usaremos en nuestros ejemplos para estudiar la fuga de memoria en Python. La primera biblioteca es la biblioteca de Solicitudes, que nos permite realizar solicitudes HTTP a una URL en particular.

Las solicitudes deben aprenderse antes de avanzar con estas tecnologías, ya sean API REST o Web Scraping. Se devuelve una respuesta cuando se envía una solicitud a una URL.

Las aplicaciones de Python contienen funciones de gestión integradas tanto para la solicitud como para la respuesta.

Podemos instalarlo fácilmente usando el siguiente comando.

pip install requests

Una vez que hemos instalado la librería requests, ahora instalaremos el módulo GC. Nos da acceso al recolector de basura de Python.

Tiene opciones para activar recopiladores, deshabilitar recopiladores, ajustar la frecuencia de recopilación, depurar y más.

En lenguajes de nivel inferior como C y C++, el programador debe liberar manualmente cualquier recurso que ya no esté en uso. Dicho de otro modo, desarrollar una programación para gestionar el recurso.

Sin embargo, los lenguajes de alto nivel como Python y Java contienen un concepto de recolección de basura, que es la gestión de memoria automatizada. La recolección de basura se encarga de asignar y liberar memoria para un programa.

Los métodos del módulo GC que usaremos son get_object(), el método que da el objeto rastreado de la recolección de basura. También usaremos el método collect() para proporcionar el objeto no referenciado libre de la lista que controlan los recopiladores.

Identificar pérdida de memoria en Python

Ahora, discutiremos cómo podemos identificar si hubo una pérdida de memoria mientras ejecutamos un programa. Comencemos con un ejemplo y usemos las bibliotecas mencionadas anteriormente para verificar si hubo una fuga o no.

Primero importaremos las bibliotecas mencionadas anteriormente en este ejemplo.

# python
import requests
import gc

Luego definiremos una función, getGoogle(), que solicitará una respuesta de google.com utilizando la biblioteca de Solicitudes y devolverá el código de estado recibido.

Código:

# python
def getGoogle():
    resultGot = requests.get("https://google.com")
    print("Status Code recieved is ", resultGot.status_code)
    return

Ahora definiremos otra función, checkMemoryLeak(), en la que recogeremos objetos basura antes y después de llamar a la función getGoogle().

Código:

# python
def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))
    getGoogle()
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))


checkMemoryLeak()

Producción:

Fuga de memoria en Python al solicitar

Como puede ver en el ejemplo, antes de llamar a la función, la longitud del recolector de basura era 17472, y después de llamar a nuestra función, la longitud aumentó a 17698. Muestra que siempre hay una pérdida de memoria al realizar algunas tareas.

Ahora discutiremos cómo podemos solucionar la pérdida de memoria y recopilar la mayor cantidad de datos posible sin pérdida de memoria.

Reparar pérdida de memoria en Python

Podemos arreglar la fuga de memoria en Python usando la función gc.collect(). Usaremos el mismo programa pero lo modificaremos para que no haya pérdida de memoria o sea mínima.

En este ejemplo, después de llamar a nuestra función getGoogle(), llamaremos directamente a gc.collect(), lo que reducirá la fuga de memoria y solucionará el problema.

Código:

# python
import requests
import gc


def getGoogle():
    resultGot = requests.get("https://google.com")
    print("Status Code recieved is ", resultGot.status_code)


def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))
    getGoogle()
    gc.collect()
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))


checkMemoryLeak()

Producción:

Fuga de memoria solucionada en Python al solicitar

Como puede ver en el ejemplo, la cantidad de pérdidas de memoria disminuye después de usar gc.collect(). Entonces, de esta manera, podemos evitar pérdidas de memoria durante la llamada a la función.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

Artículo relacionado - Python Memory