2012-09-07 6 views
9

Lorsque je joue avec différents algorithmes dans Haskell, il m'arrive souvent de créer un programme avec une fuite de mémoire, comme cela arrive souvent avec une évaluation paresseuse. Le programme qui prend toute la mémoire n'est pas vraiment amusant, j'ai souvent du mal à le tuer si je le réalise trop tard. Lorsque vous utilisez GHC6, j'ai simplement export GHCRTS='-M384m' dans mon .bashrc. Mais dans GHC7 ils ont ajouté un security measure que si un programme est compilé avec -rtsopts, il échoue simplement quand il est donné n'importe quelle option RTS soit sur un argument de ligne de commande ou dans GHCRTS. Malheureusement, presque aucun programme Haskell n'est compilé avec ce drapeau, donc mettre cette variable fait échouer tout (comme je l'ai découvert dans After upgrading to GHC7, all programs suddenly fail saying "Most RTS options are disabled. Link with -rtsopts to enable them.").Comment se protéger contre les programmes compilés GHC7 prenant toute la mémoire?

Des idées comment faire une utilisation de GHCRTS avec GHC7, ou un autre moyen pratique comment empêcher mes programmes de prendre toute la mémoire?

+3

Il existe bien sûr des solutions indépendantes de Haskell, limitant simplement l'utilisation de la mémoire de processus particuliers. Est-ce un Linux? - Mais pourquoi n'utilisez-vous pas simplement '-rtsopts' pour un programme dont vous savez qu'il est critique pour la mémoire? – leftaroundabout

+1

@leftaroundabout Ce qu'il dit, c'est qu'il aime activer l'option '-M384M' par défaut pour ses propres programmes en utilisant la variable d'environnement' GHCRTS', mais maintenant il ne peut pas le faire parce que d'autres outils Haskell (comme, peut-être , 'cabal-dev') échouera si on lui donne un paramètre' RTS'. –

+4

Sous Linux, vous pouvez utiliser 'ulimit -m' pour limiter la quantité de processus de mémoire démarrée depuis un shell. Les autres nix ont probablement des variations sur les commutateurs ulimit qu'ils acceptent. – ninjalj

Répondre

5

Vous pouvez compiler vos propres programmes avec -with-rtsopts=-M384m pour définir les options RTS au moment de la compilation (une fois pour toutes). Vous pouvez également configurer une "liste noire" de programmes qui ne doivent pas être exécutés avec GHCRTS dans votre .bashrc; peut-être quelque chose comme

for i in foo bar baz 
do 
    alias $i="GHCRTS= $i" 
done 
Questions connexes