2013-07-21 8 views
5

Ich brauche eine Nachschlagetabelle in 3 Dimensionen. Die Tabelle selbst hat 73x73x73 (389017) doppelte Werte.GHC kann keine großen Nachschlagetabellen verarbeiten

module Hammer.Texture.Table3D where 

import qualified Data.Vector   as V 
import qualified Data.Vector.Unboxed as U 

import   Data.Vector.Unboxed (Vector) 

table3D :: V.Vector (V.Vector (Vector Double)) 
table3D = V.fromList [table0, table1, ... table72] 

table0 = V.fromList $ map U.fromList [ 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00], 
    ..... 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00]] 
..... 
table72 = V.fromList $ map U.fromList [ 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00], 
    ..... 
    [1.973921e+01, 0.000000e+00, ... 0.000000e+00]] 

Das Problem ist, dass GHC diese Größe von Vector Doppel nicht verarbeiten kann oder [Double], die GHC Kompilierung viel Zeit in Anspruch nimmt (~ 2 min), bis schließlich bläst der Speicher. Es scheint, dass es einen Speicherleck auf GHC oder einen Bug gibt, weil es für sehr große String ([Char]) funktioniert.

Welche Lösungen gibt es, wenn überhaupt, zum Erstellen von "großen" Nachschlagetabellen (Double-Typ) mit GHC?

+1

Haben Sie versucht, stattdessen Arrays wie 'Data.Array' oder' Data.Array.Repa' zu verwenden? Es sieht so aus, als ob Sie einen Container fester Größe anstelle eines Vektors brauchen –

+1

Also ... ist das eine 10 MB Quelldatei mit der ganzen Tabelle in Textform drin? Warum würdest du es so machen? Ich bin mir ziemlich sicher, dass es kein Problem wäre, so große 'Vektoren' zur Laufzeit zu erzeugen, die viel effizienter aus einer Binärdatei gelesen werden können. Obwohl ich zugibt, nur in die Quelle hineinzukommen, ist es ein guter Weg, mich leicht von "IO" fernzuhalten. – leftaroundabout

+1

Wenn läuft gut mit String ... warum nicht hardcode strings (nicht verdoppelt)? (dann 'lesen', natürlich), ist hässlich, aber läuft vielleicht gut ... – josejuan

Antwort

8

kann ich von zwei Möglichkeiten denken:

  1. die Vektoren in einer Datei serialisiert und beim Programmstart deserialisieren sie (vielleicht unsafeInterleaveIO verwenden, wenn Sie dies möchten passieren, wenn die Lookup-Tabelle zunächst eher verwendet wird als wenn das Programm startet.
  2. Wenn die Nachschlagetabelle wirklich so spärlich ist, wie es Ihr Pseudocode vorschlägt, sollten Sie eine spärliche Datenstruktur verwenden - z. Data.Map oder auch nur eine einfache Funktion. Bei Bedarf können Sie diese dünne Datenstruktur verwenden, um Ihre Vektoren zu generieren (auch zur Laufzeit).
Verwandte Themen