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
risposta
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
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.
- 1. Utilizzo dello spazio sicuro per tipo Haskell
- 2. perdite di memoria Node.js?
- 3. Perdite di memoria Python
- 4. controllo perdite di memoria in Windows
- 5. Alcune perdite di memoria in Facebook SDK
- 6. gestori e perdite di memoria in Android
- 7. Perdite di memoria in CFStreamCreatePairWithSocketToHost iOS
- 8. Memoria rischio di perdite in JavaScript chiusure
- 9. Utilizzo di Jconsole per perdite di memoria
- 10. rilevamento perdite di memoria in C++ con/senza rilevatore di perdite visive
- 11. Perdite di memoria che sono ancora presenti in WPF 4
- 12. Perdite di memoria del servizio WCF
- 13. Perdite di memoria massive WP8
- 14. Perché questo programma Haskell perde spazio quando compilato con ottimizzazioni?
- 15. Perdite di memoria direttive angolari?
- 16. Derivative Towers e come utilizzare il pacchetto spazio vettoriale (haskell)
- 17. Rilevatore di perdite/profilometro VS2010
- 18. Come evitare perdite di memoria?
- 19. Perdite di memoria Oracle T4CPreparedStatement?
- 20. Java Assegnazione di memoria Perdite
- 21. Perdite di memoria tramite socket.io
- 22. Come far fronte allo spazio dei nomi Haskell?
- 23. Le perdite (strumento) segnalano perdite negli oggetti autoreleased
- 24. Come posso evitare errori di spazio PermGen in Netbeans?
- 25. decomposizione con perdite
- 26. Android GLSurfaceView causa perdite?
- 27. Esiste una convenzione di denominazione standard per moduli/spazio dei nomi in haskell?
- 28. Gettati di perdite di risorse .NET
- 29. Prevenzione di perdite di memoria di riferimento cicliche in Perl
- 30. L'utilizzo di goto causerà perdite di memoria?
Date un'occhiata a Edward Z. Yang's [Space leak zoo] (http://blog.ezyang.com/2011/05/space-leak-zoo/). –