Haskell程序中的高内存使用率

时间:2015-01-13 02:40:12

标签: haskell memory

我在Haskell程序中遇到非常高的内存消耗。我试图用一个简短的伪Haskell示例来简化这种情况。在我的实际程序中,一些测试数据在完成所有插入后,LF(logframe)为24MB。在这种情况下,程序使用2GB的内存!

我的理论是,这是因为最终逻辑帧的每个阶段都保存在内存中,直到函数终止,即使我只对递归到底时计算的逻辑帧感兴趣。有人可以验证或解雇这种情况吗?如果这是问题的原因,任何人都可以提出如何构建程序以避免大量使用内存的建议吗?我试图用let替换ex (ex lf1)表达式,但这只会使内存使用率略有下降。

import qualified Data.Map as Map
type LF = Map.Map Int Bool
ex :: various parameters -> LF -> LF
ex case1 lf = lf
ex case2 lf = let lf1 = ex lf 
                  lf2 = ex lf1
              in lf2
ex case3 lf = ex(Map.insert some-int some-bool lf)

真的希望有人可以提供帮助!如果您需要一些真正的代码,请告诉我,我只是认为这是解释和理解问题的最简单方法:)

更新

  • 抱歉," ex" -function调用了一个名为" closure"的函数。这被编辑为递归调用" ex"本身。

  • 我尝试过使用Data.IntMap.Strict而没有运气。

  • 我已粘贴了一些可运行的代码here。它是一个正则表达式解析器,它从正则表达式生成NFA并模拟NFA中的输入字符串。要查看的相关代码是"模拟"它启动计算并调用递归调用" closure"和"步骤"。 " re2nfa"只是在那里能够测试代码 - 我100%确定这个函数是否是高内存消耗的原因。

  • 代码末尾有注释,其中包含如何调用模拟函数的示例。

  • 我会阅读有关分析技巧的内容,看看能否找出问题所在。

0 个答案:

没有答案