Warum erhöht das Striktheits-Flag die Speichernutzung?

8

Die folgenden zwei Programme unterscheiden sich nur durch das Striktheitsflag auf Variable st

$ cat testStrictL.hs

%Vor%

$ cat testStrictS.hs

%Vor%

Kompilieren und Ausführen dieser beiden Programme auf Ubuntu 10.10 mit ghc 7.03 Ich bekomme folgende Ergebnisse

%Vor%

Könnte jemand bitte erklären, warum die Strenge-Flagge das Programm dazu bringt, so viel zu verwenden Erinnerung? Dieses einfache Beispiel entstand aus meinen Versuchen zu verstehen, warum meine Programme Verwenden Sie so viel Speicher, wenn Sie große Dateien mit 5 Millionen Zeilen lesen und Vektoren erstellen von Datensätzen.

    
user449050 01.08.2011, 02:59
quelle

1 Antwort

8

Das Problem hier ist hauptsächlich, dass Sie den String (was ein Alias ​​für [Char] ist) verwenden, der aufgrund seiner Darstellung als nicht strikte Liste von einzelnen Char s 5 Wörter pro Zeichen erfordert auf dem Speicher-Heap (Siehe auch diesen Blogartikel für einige Speicherabdruckvergleiche)

Im faulen Fall speichert man im Grunde einen nicht bewerteten Thunk, der auf die (gemeinsame) Bewertungsfunktion show . (+10000000) und eine variierende ganze Zahl zeigt, während im strengen Fall die vollständigen Strings aus 8 Zeichen materialisiert zu sein scheinen (normalerweise der Knall) -pattern würde nur den äußersten Listenkonstruktor : erzwingen, dh das erste Zeichen eines lazy String , das ausgewertet werden soll. Dies erfordert viel mehr Heap-Speicher, je länger die Strings werden.

Das Speichern von 5000000 String -typed Strings der Länge 8 erfordert somit 5000000 * 8 * 5 = 200000000 Wörter, was bei 32-Bit etwa ~ 763 MiB entspricht. Wenn die Char -Ziffern geteilt werden, benötigen Sie nur 3/5 davon, d. H. ~ 458 MiB, was mit Ihrem beobachteten Speicheraufwand übereinstimmt.

Wenn Sie String durch etwas kompakteres wie Data.ByteString.ByteString ersetzen, werden Sie feststellen, dass der Speicherbedarf um etwa eine Größenordnung niedriger ist als bei Verwendung einer einfachen String .

    
hvr 01.08.2011, 08:24
quelle

Tags und Links