5

我需要使用 3 个维度的查找表。该表本身具有 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 无法处理 Vector Double 或 [Double] 的这种大小,GHC 编译需要很长时间(~ 2 分钟),直到最后内存爆炸。GHC 上似乎存在内存泄漏或一些错误,因为它适用于非常大的字符串 ([Char])。

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

4

1 回答 1

8

我能想到两种可能:

  1. 将向量序列化为文件,并在程序启动时将它们反序列化(如果您希望在首次使用查找表时而不是在程序启动时发生这种情况,则可能使用 unsafeInterleaveIO)。
  2. 如果查找表真的像您的伪代码所建议的那样稀疏,请考虑使用稀疏数据结构——例如Data.Map,甚至只是一个普通函数。如有必要,您可以使用此稀疏数据结构来生成向量(再次在运行时)。
于 2013-07-21T18:50:51.763 回答