fbientrigo / grav_lensing

A Python toy model for gravitational lensing with educative means
0 stars 0 forks source link

Implementación de Monitoreo de Memoria en `load_dataset.py` #1

Closed fbientrigo closed 2 months ago

fbientrigo commented 2 months ago

Vamos a final\grav_lens\utils, donde se encuentra el archivo principal de manejo de datos, llamado load_dataset.py. A continuación, explicaremos cómo instrumentar el código para identificar posibles sobrecargas de memoria y optimizar su uso.

1. Instalación de Dependencias

Primero, asegúrate de tener instaladas las herramientas necesarias para monitorear el uso de memoria en Python:

pip install memory-profiler

2. Instrumentación del Código con memory-profiler

Abre load_dataset.py y añade decoradores de memory-profiler en las funciones que consideres críticas en términos de uso de memoria. A continuación, un ejemplo de cómo hacerlo:

from memory_profiler import profile

@profile
def load_npy_files(file_paths):
    """
    Carga archivos .npy desde una lista de rutas de archivos.

    Parameters:
        rutas_archivos (list of str): Lista de rutas a los archivos .npy.

    Returns:
        list of numpy.ndarray: Lista de arrays cargados desde los archivos .npy.
    """
    return [np.load(file) for file in file_paths]

Este decorador permitirá monitorear el uso de memoria de esta función específica.

3. Ejecutar el Perfilador de Memoria

Guarda el archivo y ejecuta el script usando memory-profiler para generar un perfil del uso de memoria:

mprof run load_dataset.py

y ver con

mprof plot

Quest

Crear un documento simple .md (markdown) que explique los resultados explicados de mprof, almacenandolo en una carpeta en el root llamada 06_memory

fbientrigo commented 2 months ago

En la carpeta de la libreria, encontrandose dentro de lib/grav_lens/testing/ se encuentra a;adido lo que viene a ser el memory_dataloader.py el cual comparó la vieja implementación y la nueva en terminos de memoria.

La nueva implementación se encarga de solo crear el generator, por tanto el tiempo de ejecución que se observaba en la versión antigua habría de verse reflejado en el nuevo metodo.

Comparación simple de escalado

Sin embargo si contamos con que buscar dentro de un arreglo es una operación O(N), en el metodo antiguo tenemos

Mientras que el metodo nuevo al ser un generador, unicamente itera en tiempo en los archivos con una memoria fija O(1) y el proceso de carga total viene a ser O(N) en tiempo, pero sigue constante O(1) en memoria.

efficiency_report