Lo he leído muchas veces que la evaluación perezosa en Haskell a veces puede dar lugar a fugas de espacio. ¿Qué tipo de código puede conducir a fugas de espacio? ¿Cómo detectarlos? ¿Y qué precauciones puede tomar parte de un programador para evitarlas?Fugas de espacio en Haskell
Respuesta
Probablemente obtendrá muchos respuestas, esta es la que me he encontrado al intentar hacer alguna aplicación del "mundo real". Estaba usando multihilo y algunos MVars para pasar datos (MVar es algo así como la memoria compartida bloqueada). Mi patrón típico era:
a <- takeMVar mvar
putMVar mvar (a + 1)
Y entonces, sólo a veces, cuando una condición adecuada sucedió que hice algo como:
a <- takeMVar mvar
when (a > 10) ....
El problema es que el contenido de mvar era esencialmente (0 + 1 + 1 + 1 + ....) ... que fue bastante intensivo para números como 100k ... Este tipo de problema era bastante generalizado en mi código; desafortunadamente para aplicaciones de subprocesamiento múltiple es muy fácil entrar en tales problemas.
Detectando ... lo que me estaba empezando Haskell en el modo que produce datos sobre el consumo de memoria, iniciar y detener diferentes hilos y mirando si el consumo de memoria es estable o no ...
Anotomy of a thunk leak (with instructions how to debug it)
Un ejemplo: Thunk memory leak as a result of map function
Me he encontrado con este problema al hacer recursividad en estructuras de datos de gran tamaño. Los thunks acumulados llegan a ser demasiado y luego obtienes una pérdida de espacio.
En Haskell, debe ser constantemente consciente de la posibilidad de encontrarse con una fuga de espacio. Como la iteración no existe, básicamente cualquier función recursiva tiene el potencial de generar una fuga de espacio.
Para evitar este problema, memorice las funciones recursivas o rescrínelas recursivamente.
- 1. Fugas de espacio, y escritores, y sumas (¡oh!)
- 2. Espacio en blanco personalizado con Haskell Parsec
- 3. Evitar la contaminación del espacio de nombres en Haskell
- 4. Fugas (instrumento) informa fugas en objetos liberados automáticamente
- 5. Fugas de memoria en .NET
- 6. Cómo diferenciar integrales con biblioteca de espacio vectorial (haskell)
- 7. Fugas de memoria detectadas
- 8. Fugas de memoria WPF
- 9. memoria cheque fugas en ventanas
- 10. Fugas de memoria de CDialog en VC10
- 11. Detección de fugas de memoria en nodejs
- 12. ¿Suscripciones de fugas de ReactiveUI?
- 13. Fugas de memoria de Python
- 14. Computación acotada en Haskell
- 15. ¿Hay fugas de memoria en Python?
- 16. ¿Detecta fugas de memoria en programas C?
- 17. C# Fugas de memoria basadas en eventos
- 18. Fugas de memoria en C# WPF
- 19. Evitar fugas de memoria en el dojo?
- 20. memoria riesgo de fugas en JavaScript cierres
- 21. cómo encontrar fugas de memoria en javascript
- 22. CFNetwork/NSURLConnection fugas
- 23. ¿Cómo evitar fugas de memoria?
- 24. Fugas de memoria usando socket.io
- 25. memoria CGContextDrawPDFPage fugas
- 26. memoria Valgrind C++ fugas
- 27. (iphone) UIImageView setImage: ¿fugas?
- 28. Java Memoria Asignación Fugas
- 29. Dando sentido a la utilidad de línea de comandos de "fugas" para encontrar fugas de memoria
- 30. ¿Cómo escribo una función de longitud de espacio constante en Haskell?
Eche un vistazo al [Space leak zoo] de Edward Z. Yang (http://blog.ezyang.com/2011/05/space-leak-zoo/). –