2013-07-21 9 views
5

Potrzebuję użyć tabeli odnośników w 3 wymiarach. Sama tabela ma podwójne wartości 73x73x73 (389017).GHC nie obsługuje dużych tabel wyszukiwania

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]] 

Problemem jest to, że GHC nie może obsłużyć tej wielkości wektorowych Double or [Double], kompilacja GHC zajmuje dużo czasu (~ 2 min), aż wreszcie pamięć wysadza. Wygląda na to, że istnieje wyciek pamięci w GHC lub jakiś błąd, ponieważ działa dobrze dla bardzo dużego ciągu ([Char]).

Jakie rozwiązania, jeśli istnieją, są dostępne do tworzenia "dużych" tabel wyszukiwania (typu Double) przy użyciu GHC?

+1

Czy próbowałeś używać tablic typu 'Data.Array' lub' Data.Array.Repa'? Wygląda na to, że potrzebujesz pojemnika o stałym rozmiarze, a nie wektora. –

+1

Więc ... to jest plik źródłowy o wielkości 10 MB z całą tabelą w postaci tekstowej? Dlaczego zrobiłbyś to w ten sposób? Jestem pewien, że generowanie dużych plików 'Vector' w czasie wykonywania nie byłoby problemem, o wiele bardziej wydajnym czytaniem z pliku binarnego. Chociaż przyznaję, że samo umieszczenie źródła jest dobrym sposobem na łatwe uniknięcie 'IO'. – leftaroundabout

+1

Jeśli działa dobrze z ciągiem ... dlaczego nie ciągi kodów (nie podwajają)? (następnie "czytaj", oczywiście), jest brzydki, ale może działa dobrze ... – josejuan

Odpowiedz

8

mogę myśleć o dwóch możliwości:

  1. Serializować wektorów do pliku, a przy uruchamianiu programu deserializowania nich (być może przy użyciu unsafeInterleaveIO jeśli chcesz to się stało, gdy tabeli odnośników jest najpierw stosowany zamiast kiedy program się rozpocznie).
  2. Jeśli tabela odnośników jest naprawdę tak rzadka, jak sugeruje twój pseudokod, należy rozważyć użycie rzadkiej struktury danych - np. Data.Map lub nawet zwykłą funkcję. W razie potrzeby można użyć tej rzadkiej struktury danych do wygenerowania wektorów (ponownie w czasie wykonywania).
Powiązane problemy