2013-07-21 25 views
5

3 boyutta bir arama tablosu kullanmam gerekiyor. Masanın kendisi 73x73x73 (389017) çift değerlere sahiptir.GHC büyük arama tablolarını işleyemiyor

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

sorun GHC vektör çift veya [çift] Bu boyut işleyemez yani, GHC derleme çok fazla zaman alır (~ 2 dakika) kadar, en sonunda, bellek darbeler. Çok büyük bir String ([Char]) için iyi çalıştığından, GHC'de veya bazı hatalarda bir bellek sızıntısı var gibi görünüyor.

GHC kullanarak "büyük" arama tabloları oluşturmak için hangi çözümler mevcuttur (Çift tip)? İki olasılık

+1

Bunun yerine "Data.Array" veya "Data.Array.Repa" gibi dizileri kullanmayı denediniz mi? O zaman bir vektör –

+1

bir sabit boyutta bir kapsayıcıya ihtiyacınız var gibi görünüyor ... Bu, bu metin biçiminde tüm tablo ile 10 MB kaynak dosya gibi bir? Neden böyle yaparsın? Çalışma zamanında böyle büyük 'Vector's üretmek için bir sorun olmaz, bir ikili dosyadan çok daha verimli bir şekilde okuyun. Ben sadece kaynağa koyarak itiraf etmeliyim ki, 'IO'dan kolayca uzak durmanın iyi bir yolu. – leftaroundabout

+1

Dize ile düzgün çalışıyorsa ... neden dizeleri (çiftler değil) sabit değil? (sonra, 'oku', elbette), çirkin ama belki de iyi çalışır ... – josejuan

cevap

8

düşünebiliriz: Arama tablosu ilk ziyade kullanıldığında eğer bu isterseniz

  1. belki unsafeInterleaveIO kullanarak (onları serisini bir dosyaya vektörleri seri hale ve program başlangıçta program başladığında).
  2. Arama tablosu, sahte kodunuzun önerdiği kadar seyrekse, seyrek bir veri yapısı kullanmayı düşünün - ör. Data.Map veya hatta sadece düz bir işlev. Gerekirse, vektörler oluşturmak için bu seyrek veri yapısını kullanabilirsiniz (tekrar çalışma zamanında).