Pérdida de memoria en requests de Python

Cuando un programador se olvida de borrar una memoria asignada en la memoria del montón, se produce la fuga de memoria. Es un tipo de fuga o desperdicio de recursos. Cuando hay una fuga de memoria en la aplicación, la memoria de la máquina se llena y ralentiza el rendimiento de la máquina. Este es un problema grave al crear una gran aplicación escalable.

Solicitud: la biblioteca de requests es una parte integral de Python para realizar requests HTTP a una URL específica. Ya sea que se trate de API REST o Web Scrapping, las requests deben aprenderse para continuar con estas tecnologías. Cuando uno realiza una solicitud a un URI, devuelve una respuesta. Las requests de Python proporcionan funcionalidades integradas para administrar tanto la solicitud como la respuesta.

 Módulo Gc: El módulo gc es un módulo incorporado de python, que proporciona una interfaz para el recolector de basura de python. Proporciona funciones para habilitar el recopilador, deshabilitar el recopilador, ajustar la frecuencia de recopilación, opciones de depuración y más.

En lenguajes de nivel inferior como C y C++, el programador debe liberar manualmente el recurso que no se usa, es decir, escribir código para administrar el recurso. Pero los lenguajes de alto nivel como python, java tienen un concepto de administrador de memoria automático conocido como recolector de basura. El recolector de basura administra la asignación y liberación de memoria para una aplicación.  

Algunos métodos gc que usaremos se enumeran a continuación.

  • get_objects(): este método devuelve una lista de todos los objetos rastreados por el recolector de basura, excluida la lista que se devuelve.
  • collect(): este método libera el objeto no referenciado en la lista que mantiene el recopilador. Algunos objetos no referenciados no se liberan inmediatamente de forma automática debido a su implementación.

Usaremos el método get() en las requests, que devuelve un objeto de respuesta. Cuando el objeto de respuesta no está referenciado, es decir, se elimina, su memoria debe liberarse inmediatamente, pero debido a su implementación, el recurso no se libera automáticamente. Aquí sus estadísticas pierden memoria.

Identificar fuga de memoria:

Acercarse:

  • Obtenga y almacene la cantidad de objetos rastreados (creados y vivos) por Collector. Puede usar gc.get_objects() para obtener una lista de objetos rastreados y luego usar la función len para contar no. de objetos
  • Llame a la función que llama al método request.get().
  • Imprima el código de estado de la respuesta, para que podamos confirmar que se creó el objeto.
  • Luego devuelve la función. Cuando se devuelve la función, se deben eliminar todos los creados dentro de la función.
  • Obtenga el número de objetos rastreados actualmente y compare la válvula con el valor anterior para los objetos filtrados.
  • Si actualmente, el recuento de objetos devueltos es mayor, entonces hay una pérdida de memoria.

A continuación se muestra la implementación:

Python3

import requests
import gc
 
def call():
   
    # call the get with a url,here I used google.com
    # get method returns a response object
    response = requests.get('https://google.com')
     
    # print the status code of response
    print("Status code", response.status_code)
     
    # After the function is been returned,
    # the response object becomes non-referenced
    return
 
 
def main():
    print("No.of tracked objects before calling get method")
     
    # gc.get_objects() returns list objects been tracked
    # by the collector.
    # print the length of object list with len function.
    print(len( gc.get_objects() ) )
     
    # make a call to the function, that calls get method.
    call()
 
    print("No.of tracked objects after calling get method")
     
    # print the length of object list with len function.
    print(len( gc.get_objects() ) )
 
if __name__ == "__main__":
    main()

Producción:

No.of tracked objects before calling get method
16071
Status code 200
No.of tracked objects after calling get method
16158

Arreglar pérdida de memoria:

Una solución simple a esto es llamar manualmente al método gc.collect(), este método liberará el recurso inmediatamente.

Acercarse:

  • Obtenga y almacene la cantidad de objetos rastreados (creados y vivos) por Collector. Puede usar gc.get_objects() para obtener una lista de objetos rastreados y luego usar la función len para contar no. de objetos
  • Llame a la función que llama al método request.get().
  • Imprima el código de estado de la respuesta, para que podamos confirmar que se creó el objeto.
  • Luego devuelve la función. Cuando se devuelve la función, se deben eliminar todos los creados dentro de la función.
  • Llame al recolector de basura para liberar el recurso no utilizado, es decir, para llamar al método gc.collect().
  • Obtenga la cantidad de objetos rastreados actualmente, ahora puede notar la menor cantidad de objetos debido a la limpieza de recursos no utilizados.

A continuación se muestra la implementación:

Python3

import requests
import gc
 
def call():
   
    # call the get with a url,here I used google.com
    # get method returns a response object
    response = requests.get('https://google.com')
     
    # print the status code of response
    print("Status code",response.status_code)
     
    # After the function is been returned,
    # the response object becomes non-referenced
    return
 
 
def main():
    print("No.of tracked objects before calling get method")
     
    # gc.get_objects() returns list objects been tracked
    # by the collector.
    # print the length of object list with len function.
    print(len( gc.get_objects() ) )
     
    # make a call to the function, that calls get method.
    call()
     
    # collect method immediately free the resource of
    # non-referenced object.
    gc.collect()
 
    # print the length of object list with len
    # function after removing non-referenced object.
    print("No.of tracked objects after removing non-referenced objects")
    print(len( gc.get_objects() ) )
 
 
if __name__ == "__main__":
    main()

Producción:

No.of tracked objects before calling get method
16071
Status code 200
No.of tracked objects after removing non-referenced objects
15954

Publicación traducida automáticamente

Artículo escrito por kabilan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *