Solución:
De acuerdo con la documentación oficial de Python, puede forzar al recolector de basura a liberar memoria sin referencia con gc.collect()
. Ejemplo:
import gc
gc.collect()
Desafortunadamente (dependiendo de su versión y lanzamiento de Python), algunos tipos de objetos usan “listas libres” que son una optimización local ordenada pero pueden causar fragmentación de la memoria, específicamente al hacer que cada vez más memoria esté “reservada” solo para objetos de cierto tipo y por lo tanto, no disponible para el “fondo general”.
La única forma realmente confiable de asegurar que un uso grande pero temporal de la memoria devuelva todos los recursos al sistema cuando se hace, es hacer que ese uso ocurra en un subproceso, que hace que el trabajo que consume mucha memoria y luego termina. En tales condiciones, el sistema operativo hará su trabajo y reciclará con gusto todos los recursos que el subproceso pueda haber devorado. Afortunadamente, el multiprocessing
El módulo hace que este tipo de operación (que solía ser bastante molesta) no sea tan mala en las versiones modernas de Python.
En su caso de uso, parece que la mejor manera para que los subprocesos acumulen algunos resultados y, sin embargo, se aseguren de que esos resultados estén disponibles para el proceso principal, es usar archivos semi-temporales (por semi-temporales quiero decir, NO el tipo de archivos que desaparecen automáticamente cuando se cierran, solo los archivos ordinarios que elimina explícitamente cuando haya terminado con ellos).
los del
declaración podría ser de utilidad, pero IIRC no está garantizado para liberar la memoria. Los documentos están aquí … y un motivo por el que no se publica está aquí.
He escuchado a personas en sistemas Linux y Unix bifurcar un proceso de Python para hacer algo de trabajo, obtener resultados y luego matarlo.
Este artículo tiene notas sobre el recolector de basura de Python, pero creo que La falta de control de la memoria es la desventaja de la memoria administrada.