¿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')
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 bibliotecaGymWrapper
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.