Haskell GHC can';无法处理大型查找表

Haskell GHC can';无法处理大型查找表,haskell,ghc,Haskell,Ghc,我需要使用三维的查找表。表本身有73x73x73(389017)个双精度值 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 Doubl

我需要使用三维的查找表。表本身有73x73x73(389017)个双精度值

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无法处理这种大小的向量Double或[Double],GHC编译需要花费大量时间(~2分钟),直到最后内存崩溃。GHC上似乎存在内存泄漏或某些错误,因为它适用于非常大的字符串([Char])


使用GHC创建“大型”查找表(双类型)有哪些解决方案(如果有的话)?

我可以想到两种可能性:

  • 将向量序列化为文件,并在程序启动时反序列化它们(如果希望在首次使用查找表时而不是在程序启动时发生这种情况,可以使用unsafeInterleaveIO)
  • 如果查找表和伪代码所建议的一样稀疏,考虑使用稀疏数据结构——例如“代码>数据.MAP<代码>或甚至只是一个简单函数。如有必要,可以使用此稀疏数据结构生成向量(同样在运行时)

  • 您是否尝试过改用
    Data.Array
    Data.Array.Repa
    等数组?看起来你需要一个固定大小的容器,而不是一个。。。这是一个10MB的源文件,里面有整个文本表格?你为什么要这样做?我很确定,在运行时生成如此大的
    向量
    s,从二进制文件中更有效地读取,不会有问题。尽管我承认,仅仅输入源代码是一种很好的方法,可以轻松远离
    IO
    。。。为什么不硬编码字符串(而不是双精度)?(当然,
    read
    )很难看,但可能运行得很好……我想您应该看看,在编译大常量时,它也有同样的问题。