2013-07-21 62 views
5

我需要在3維中使用查找表。該表本身具有73x73x73(389017)的雙精度值。GHC無法處理大型查找表

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

的問題是,GHC不能處理這個尺寸矢量的雙重或[雙]中,GHC編譯需要花費大量的時間(約2分鐘),直至最後,存儲器鼓起。 GHC似乎存在內存泄漏或者一些錯誤,因爲它對於非常大的字符串([Char])工作正常。

什麼解決方案(如果有的話)可用於創建使用GHC的「大型」查找表(雙類型)?

+1

您是否嘗試過使用類似'Data.Array'或'Data.Array.Repa'的數組?它看起來像你需要一個固定大小的容器,而不是一個矢量 –

+1

因此,這是一個10MB的源文件,其中的文本形式的整個表格呢?你爲什麼要這樣做?我很確定,在運行時生成如此大的'Vector'並不是一個問題,從二進制文件中讀取效率更高。雖然我承認只要在源代碼中加入是一種很容易遠離「IO」的好方法。 – leftaroundabout

+1

如果運行良好的字符串......爲什麼不硬編碼字符串(不是雙打)? (然後'讀',當然),是醜陋的,但也許運行良好... – josejuan

回答

8

我能想到的兩種可能性:

  1. 序列化向量到一個文件,並在程序啓動反序列化他們(可能使用unsafeInterleaveIO如果你想這種事情發生時,對照表中第一次使用,而不是當程序啓動時)。
  2. 如果查找表確實與您的僞代碼一樣稀疏,請考慮使用稀疏數據結構 - 例如, Data.Map甚至只是一個普通的功能。如有必要,您可以使用此稀疏數據結構生成向量(同樣在運行時)。