为什么这段代码会抛出一个内存不足的异常?

时间:2013-07-26 06:56:16

标签: haskell sparse-matrix

我决定挖掘几个月前开始的Haskell项目。它是稀疏矩阵库的开始。任何人都可以看到任何明显的代码,这将导致它为中型矩阵(2500 x 2500双打)抛出内存不足的异常?我了解通常最好发布完整的可构建代码,如果需要我可以发布更多代码。下面的代码使用未装箱的向量将SparseMatrix类型(IntMap(IntMap Double))转换为更高效的SkyLine表示。这适用于较小的矩阵。我认为它可能与foldl与foldr的使用有关,所以我切换它们但它似乎没有什么区别。这是“空间泄漏”吗?感谢。

编辑:看了这个之后,我认为问题是Vector Append。这必须每次都创建一个新的Vector。我注意到我投了一票,也许如果我解决问题并发布答案我可以重新获得一些信誉吗?

import Math.LinearAlgebra.Sparse hiding (mulMV,dot)
import qualified Data.IntMap as IM
import qualified Data.Vector.Unboxed as V

type IdxM = (Int,Int)

data SKYSpM = SKYSpM {val   :: V.Vector Double                   
                     ,rcIdx :: V.Vector (Int, Int)           
                     ,dims  :: IdxM
                     }deriving(Show)

skySpM :: Int -> SKYSpM
skySpM i = SKYSpM (V.empty::V.Vector Double) (V.empty::V.Vector (Int,Int)) (i,i)


toSKY :: SparseMatrix Double -> SKYSpM
toSKY m = SKYSpM v' (V.snoc idxs' $ V.last idxs') d' 
  where (SKYSpM v' idxs' d')  = foldl f (skySpM $ height m) [1..(height m)]
        f (SKYSpM v idxs d) i = SKYSpM (v V.++ v') (V.snoc idxs (V.length v,jmin-1)) d
          where v' = foldl (\acc x -> V.snoc acc (r ! x)) V.empty [jmin..jmax]
                (jmin,_) = (IM.findMin $ vec r) 
                (jmax,_) = (IM.findMax $ vec r) 
                r        = row m i

0 个答案:

没有答案