18

Je l'ai lu plusieurs fois que l'évaluation paresseuse dans Haskell peut parfois conduire à des fuites d'espace. Quel type de code peut conduire à des fuites d'espace? Comment les détecter? Et quelles précautions peuvent être prises sur une partie d'un programmeur pour les éviter?Fuites d'espace dans Haskell

+7

Jetez un coup d'œil à [Space leak zoo] d'Edward Z. Yang (http://blog.ezyang.com/2011/05/space-leak-zoo/). –

Répondre

12

Vous obtiendrez probablement beaucoup de réponses, c'est celui que j'ai rencontré en essayant de faire une application 'monde réel'. J'utilisais le multithreading et certains MVars pour transmettre des données (MVar est quelque chose comme de la mémoire partagée verrouillée). Mon modèle typique était:

a <- takeMVar mvar 
putMVar mvar (a + 1) 

Et puis, juste parfois, quand un bon état est arrivé, je l'ai fait quelque chose comme:

a <- takeMVar mvar 
when (a > 10) .... 

Le problème est que le contenu de Mvar était essentiellement (0 + 1 + 1 + 1 + ....) ... ce qui était assez intensif pour des nombres comme 100k ... Ce type de problème était très répandu dans mon code; Malheureusement, pour les applications multithread, il est très facile d'entrer dans de tels problèmes.

Détection ... ce que je ne commençais haskell en mode qui produit des données concernant la consommation de mémoire, le démarrage et l'arrêt de différents fils et regarder si l'empreinte mémoire est stable ou non ...

Anotomy of a thunk leak (with instructions how to debug it)

Un exemple: Thunk memory leak as a result of map function

4

J'ai rencontré ce problème lors de la récursion sur de grandes structures de données. Les thunks accumulés peuvent être trop et alors vous obtenez une fuite d'espace.

Dans Haskell, vous devez être constamment conscient de la possibilité de courir dans une fuite d'espace. Puisque l'itération n'existe pas, n'importe quelle fonction récursive a le potentiel de générer une fuite d'espace.

Pour éviter ce problème, notez les fonctions récursives ou réécrivez-les de manière récursive.