haskell程序中的内存泄漏

时间:2014-01-01 05:14:10

标签: haskell memory-management garbage-collection

我一直在尝试使用haskell程序读取和索引一组链接和维基百科摘要。目的是

  1. 从文件中读取一行
  2. 解析
  3. 哈希并索引该行的某些部分,以及文件中的偏移量,以便我以后可以找到它
  4. 问题是我的程序非常慢并且使用大量内存。我做了一些分析,我知道大部分时间(约50%)花在垃圾收集上。我已经尝试了一切我能想到的东西,包括:

    1. 使用Data.Map作为存储的ST monad东西
    2. 使用散列值作为键,而不是保留整个字节串
    3. 使用seq和deepseq尝试阻止延迟分配
    4. 逐行解析,而不是希望懒惰会使解析的行列表空间和时间效率
    5. 使用不可变的哈希映射而不是Data.Map
    6. 使用可变的哈希映射
    7. 代码,数据,分析输出和编译内容:https://gist.github.com/ririw/8205284

      谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我设法将测试集的内存使用量减少了100MB左右(dbpedia链接数据集的前400K行,http://downloads.dbpedia.org/3.9/en/wikipedia_links_en.nt.bz2处可用)。

我通过切换到io-streams库来实现这一点,这个库似乎解决了一些懒惰问题。

您可以在https://gist.github.com/ririw/8207250

看到新的解决方案

在一个7574825行数据集上,它确实没问题,并且内存使用量的增长方式与我希望哈希表填充自身并随机移动(http://imgur.com/pcDnKcP)的方式相同。当然,这也可能是io-streams缓冲区做同样的事情。

它仍然使用了大量的内存:(,但我认为已经解决了懒惰/ io问题