No tengo un ejemplo de código, pero tengo curiosidad de saber si es posible escribir código Python que resulte esencialmente en una pérdida de memoria.¿Es posible tener una pérdida de memoria real en Python debido a su código?
Respuesta
Es posible, sí.
Depende del tipo de pérdida de memoria de la que está hablando. Dentro del código python puro, no es posible "olvidar liberar" la memoria como en C, pero es posible dejar una referencia colgada en algún lugar. Algunos ejemplos de tales:
un objeto de rastreo no controlada que está manteniendo un marco de pila entera viva, a pesar de que la función ya no se está ejecutando
almacenar valores en un ámbito de clase o global en lugar de instancia alcance y sin darse cuenta.
Referencias cíclicas en las clases que también tienen un método
__del__
. Irónicamente, la existencia de un__del__
hace imposible que el recolector de basura cíclico limpie una instancia.extensiones C mal implementadas o que no usan correctamente las bibliotecas C como se supone que deben ser.
Scopes que contienen cierres que contienen un conjunto mucho más de lo que podría haber esperado
parámetros predeterminados que son tipos mutables:
.
def foo(a=[]):
a.append(time.time())
return a
Y mucho más .....
Buena mención de los parámetros predeterminados mutables. Son peligrosos porque la forma en que trabajan no es realmente intuitiva, pero también porque pueden crecer mucho si no se cuida ... +1 –
+1 por mencionar esa implementación del método foo. ¡Nunca lo supe! –
¿Podría elaborar o proporcionar alguna documentación en su primera viñeta "un objeto de rastreo no controlado que mantiene vivo un marco de pila completo, aunque la función ya no se esté ejecutando"? De hecho, tengo una fuga de rastreo pero no veo por qué se hace referencia en ningún lugar (https://stackoverflow.com/questions/44681681/what-could-prevent-a-traceback-from-being-garbage-collected) – BiAiB
Por supuesto que puede. El ejemplo típico de una pérdida de memoria es si construye un caché que nunca enjuaga manualmente y que no tiene una política de desalojo automático.
Técnicamente, eso no es una pérdida de memoria ya que la aplicación aún ** puede ** liberar la memoria, aunque opta por no hacerlo. – Justin
Bueno, creo que definimos la "fuga de memoria" de manera diferente, entonces. Para mí, una fuga es una fuga, independientemente de si es posible repararla o no. –
Si no tiene código para eliminar elementos de la memoria caché, entonces no puede eliminarlos, ¿o sí? –
En el sentido de huérfanos asignados objetos después de que salgan de alcance porque se olvidó de desasignarlos, no; Python desasignará automáticamente objetos fuera del alcance (Garbage Collection). Pero en el sentido de que @Antione está hablando, sí.
La definición clásica de una pérdida de memoria es la memoria que se utiliza una vez, y ahora no lo es, pero no se ha recuperado. Eso es casi imposible con el código puro de Python. Pero como señala Antoine, puede tener el efecto de consumir toda su memoria inadvertidamente al permitir que las estructuras de datos crezcan sin límites, incluso si no necesita mantener todos los datos.
Con extensiones C, por supuesto, está de vuelta en territorio no gestionado, y todo es posible.
- 1. ¿Es esto una pérdida de memoria?
- 2. Posible pérdida de memoria usando C++ cadena
- 3. ¿Es esto una pérdida de memoria?
- 4. ¿Es posible tener un tiempo real difícil con alcance léxico?
- 5. appengine, python: ¿Hay una pérdida de memoria en taskqueue.add()?
- 6. CheckedListBox pérdida de memoria
- 7. SSIS: el valor no se puede convertir debido a una posible pérdida de datos
- 8. ¿Este código causaría pérdida de memoria?
- 9. ¿por qué este código causa una pérdida de memoria?
- 10. Anatomía de una "pérdida de memoria"
- 11. ¿Por qué este código produce una pérdida de memoria?
- 12. Posible pérdida de memoria en UIViewController con UITableView
- 13. ¿Es posible recuperar su código fuente de heroku?
- 14. Ruby, Mongodb, Anemone: rastreador web con posible pérdida de memoria?
- 15. GetOracleDecimal pérdida de memoria
- 16. JNA pérdida de memoria
- 17. CMSampleBufferRef pérdida de memoria
- 18. Sin memoria Problema de pérdida de memoria
- 19. es inaccesible debido a su nivel de protección
- 20. pérdida de memoria GETIPFROMHOST
- 21. C++: ¿push_back (new Object()) es una pérdida de memoria?
- 22. ¿El código siguiente causará pérdida de memoria en C++
- 23. ConfigurationProperty es inaccesible debido a su nivel de protección
- 24. Posible pérdida de memoria sin un destructor virtual?
- 25. La clase es inaccesible debido a su nivel de protección
- 26. Embedded IronPython pérdida de memoria
- 27. ¿Puede jQuery.data causar una pérdida de memoria?
- 28. Pérdida de memoria con ARC
- 29. ¿Es posible que un objeto Exception genere otra excepción debido a su error interno?
- 30. ¿Es posible que la pérdida de memoria también ocurra en la pila en .NET?
Debe aclarar: ¿está hablando de memoria filtrada después de que el proceso haya terminado de ejecutarse? y ¿estás hablando de Python puro sin módulos C? –