5

3 次元のルックアップ テーブルを使用する必要があります。テーブル自体には、73x73x73 (389017) の double 値があります。

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 分)。非常に大きな文字列 ([Char]) に対して正常に動作するため、GHC でのメモリ リークまたは何らかのバグがあるようです。

GHC を使用して「大きな」ルックアップ テーブル (Double タイプ) を作成するために利用できるソリューションはありますか?

4

1 に答える 1

8

次の 2 つの可能性が考えられます。

  1. ベクトルをファイルにシリアル化し、プログラムの起動時にそれらを逆シリアル化します (プログラムの起動時ではなく、ルックアップ テーブルが最初に使用されるときにこれを実行したい場合は、おそらく unsafeInterleaveIO を使用します)。
  2. ルックアップ テーブルが疑似コードが示唆するほどまばらである場合は、まばらなデータ構造を使用することを検討してください。たとえばData.Map、単純な関数でもかまいません。必要に応じて、このスパース データ構造を使用してベクトルを生成できます (これも実行時に)。
于 2013-07-21T18:50:51.763 に答える