我决定挖掘几个月前开始的 Haskell 项目。这是稀疏矩阵库的开始。任何人都可以看到有关此代码的任何明显内容会导致它为中等大小的矩阵(2500 x 2500 双打)抛出内存不足异常吗?我知道通常最好发布完整的可构建代码,如果需要我可以发布更多。下面的代码使用未装箱的向量将 SparseMatrix 类型(一个 IntMap (IntMap Double) )转换为更有效的 SkyLine 表示。这适用于较小的矩阵。我认为这可能与 foldl 与 foldr 的使用有关,所以我切换了它们,但似乎并没有什么不同。这是“空间泄漏”吗?谢谢。
编辑:再看这个之后,我认为问题出在 Vector Append 上。这必须每次都创建一个新向量。我注意到我投了反对票,也许如果我解决问题并发布答案,我可以重新获得一些信誉?
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