6
votes

Bruteforce avec évaluation paresseuse et consommation de mémoire

J'ai implémenté une petite fonction bruteforce code>, en utilisant une évaluation paresseuse pour trouver la première solution valide pour un problème:

$ ./brute +RTS -s -M200M
Heap exhausted;
Current maximum heap size is 209715200 bytes (200 MB);
use `+RTS -M<size>' to increase it.


0 commentaires

4 Réponses :


7
votes

Vous pouvez ignorer tous ces juste code> s et SO code> s je suppose ... xxx pré>

Ceci est probablement aussi bien en mémoire de la mémoire. comme bruteforce code> peut obtenir; Tous les autres problèmes sont en raison de la fonction f code> qui est brute-forcée. p>


La fonction Génératrice code> peut être réécrite comme ceci:

"aa"
"ba"
...
"za"
"ab"
"bb"


3 commentaires

Quel est le problème avec bruteforce f = listtomaybe. Filtre f ? Il ne sert à rien d'être excessivement inutile. :)


Être inutile est par définition inutile, n'est-ce pas? : P Je choisirai certainement de ne pas être complètement inutile dans ce cas au cas où elle rend la solution plus claire.


Bien que j'aime vos suggestions, il a presque la même utilisation de la mémoire: /



10
votes

Si la consommation de mémoire est la principale préoccupation, arrêtez le partage NextGen . C'est une énorme liste.

Remplacer xxx

avec xxx

et dites au compilateur que vous êtes sérieux À propos de ne pas le partager: xxx

qui fonctionne dans xxx

petite mémoire résident. Bien entendu, la recomutation signifie que l'allocation totale est beaucoup plus élevée et il faut également beaucoup plus de temps pour calculer le résultat.

Un meilleur algorithme pourrait réduire la consommation de temps et .


2 commentaires

+1 Parce que c'est l'algorithme avec un meilleur comprimé de mémoire de loin si la mémoire est la principale préoccupation.


Merci! Je ne savais pas que est tellement explicite sur le partage. À un moment donné, le partage est toujours utile dans GeneratorString , donc je le forte à le partager le premier par exemple. Cinq récursions, ce qui est une grande vitesse.



6
votes

Je pense que votre générateur est un peu trop strict. Un générateur optimal est censé donner autant que possible la liste des résultats avec autant d'informations sur le résultat de l'application récursive.

Permettez-nous de la ligne suivante. P>

$ ./brute +RTS -s
zabcde
4,165,170,696 bytes allocated in the heap
    5,569,320 bytes copied during GC
       29,848 bytes maximum residency (5 sample(s))
       26,560 bytes maximum slop
            2 MB total memory in use (0 MB lost due to fragmentation)


0 commentaires

1
votes

Puisque personne ne semble l'avoir mentionné pour le moment, j'aimerais simplement souligner que

bruteforce = data.list.find


0 commentaires