18

Ho letto molte volte che la valutazione lenta in Haskell può a volte portare a perdite di spazio. Che tipo di codice può portare a perdite di spazio? Come rilevarli? E quali precauzioni possono essere prese da parte di un programmatore per evitarle?Perdite di spazio in Haskell

+7

Date un'occhiata a Edward Z. Yang's [Space leak zoo] (http://blog.ezyang.com/2011/05/space-leak-zoo/). –

risposta

12

Otterrete probabilmente molte risposte, questa è l'unica, che ho incontrato quando ho provato a fare qualche applicazione "reale". Stavo usando il multithreading e alcuni MVars per trasmettere dati in giro (MVar è qualcosa come la memoria condivisa bloccata). Il mio modello tipico era:

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

E poi, solo a volte, quando una condizione adeguata è successo che ho fatto qualcosa di simile:

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

Il problema è che il contenuto di MVAR era essenzialmente (0 + 1 + 1 + 1 + ....) ... che era piuttosto intenso per numeri come 100k ... Questo tipo di problema era abbastanza diffuso nel mio codice; sfortunatamente per le applicazioni di multithreading è molto facile entrare in tali problemi.

Rilevamento ... quello che ho fatto iniziavo Haskell nel modo che produce i dati per quanto riguarda il consumo di memoria, avvio e arresto diversi thread e guardando se la memoria impronta è stabile o no ...

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

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

4

Ho incontrato questo problema quando eseguivo la ricorsione su strutture di dati di grandi dimensioni. I thunk accumulati diventano troppo e poi si perde spazio.

In Haskell, è necessario essere costantemente consapevoli della possibilità di incorrere in una perdita di spazio. Poiché l'iterazione non esiste, in pratica qualsiasi funzione ricorsiva ha il potenziale per generare una perdita di spazio.

Per evitare questo problema, memorizzare le funzioni ricorsive o riscriverle in modo ricorsivo.

Problemi correlati