es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Hay una fuga de memoria o no entiendo la recolección de basura y la administración de memoria?

¿Es esta una fuga de memoria en la biblioteca de terceros que estoy utilizando, o hay algo sobre la recolección de basura y la administración de memoria en Python que no entiendo?

Al final, asumiría que el uso de memoria sería similar al que tenía al principio (33 MB), porque no tengo ninguna referencia a los objetos que se crearon dentro de do_griddly_work(). Sin embargo, el uso de memoria es mucho mayor (1600 MB) y no disminuye después de salir de la función o recoger la basura.

Esto se imprime

Antes de cualquier trabajo: 33.6953125 MB
Después del trabajo de griddly: 1601.60546875 MB
0
Después de la recolección de basura: 1601.60546875 MB

con el siguiente código

from griddly import GymWrapperFactory, gd, GymWrapper
import gc
import os, psutil

def do_griddly_work():
    current_path = os.path.dirname(os.path.realpath(__file__))
    env = GymWrapper(current_path + '/griddly_descriptions/testbed1.yaml',
                     player_observer_type=gd.ObserverType.VECTOR,
                     global_observer_type=gd.ObserverType.SPRITE_2D,
                     level=0)
    env.reset()
    for _ in range(10000):
        c_env = env.clone()
    # Imprimir uso de memoria después del trabajo
    print('Después del trabajo de griddly:', psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2, 'MB')


if __name__ == '__main__':
    process = psutil.Process(os.getpid())

    # Uso de memoria antes del trabajo = ~33 MB
    print('Antes de cualquier trabajo:', process.memory_info().rss / 1024 ** 2, 'MB')

    # Hacer el trabajo que clona un entorno muchas veces
    do_griddly_work()

    # Recolectar basura
    print(gc.collect())

    # Uso de memoria después del trabajo = ~1600 MB
    print('Después de la recolección de basura:', process.memory_info().rss / 1024 ** 2, 'MB')
Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, es posible que haya un problema en la biblioteca de terceros que se está utilizando, lo cual está causando una fuga de memoria. Sin embargo, también es posible que haya una falta de comprensión de cómo funciona la recolección de basura y la gestión de memoria en Python.

    El código proporcionado clona el objeto env 10,000 veces en un bucle, creando nuevos objetos cada vez. Sin embargo, los objetos no se eliminan de la memoria incluso después de que el bucle termina y se llama a la recolección de basura. Esto sugiere que puede haber un problema con la forma en que la biblioteca GymWrapper maneja la memoria.

    También es posible que haya otros factores en juego, como el tamaño y la complejidad de los objetos que se están creando y los recursos disponibles para el sistema. Sin un análisis más detallado, es difícil determinar la causa exacta del alto uso de memoria.

Comments are closed.