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?
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 –
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
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