从DiffArray移动到Data.Vector时内存泄漏

时间:2012-03-21 01:34:36

标签: haskell memory-leaks quickcheck

在将数据结构从diffarray更改为vector后,在一次QuickCheck测试期间,内存会爆炸(无限增长)。

代码托管在GitHub。 dev分支包含病毒代码,主分支运行良好。除了微小的变化之外,唯一可能对此产生影响的提交是one。为了运行QuickCheck例程,应该运行可执行文件 tester 。似乎小长度向量不会使程序崩溃,但是当它变得越来越长时,程序会减慢并最终打开内存。 引起我兴趣的另一件事是我在渲染XML文件时在我的其他库中遇到了类似的问题。对于小文件(< 400k),它运行缓慢但没有崩溃,对于较大的文件,内存会爆炸。 Data.Vector也涉及该库。我有直觉这些问题是相关的。

编辑:我终于隔离了我的代码中重现内存泄漏的部分,并将其放入一个可以找到here的文件中。现在我使用的IArray表现得和DiffArray一样好。要在IArray和Vector之间切换,必须修改第49,93和101行。

1 个答案:

答案 0 :(得分:2)

解决了实际上,问题在于QuickCheck生成的向量。 Vector的原始Arbitrary实例如下:

instance (Arbitrary a) => Arbitrary (Vector a) where
  arbitrary   = liftM2 Vec.generate arbitrary arbitrary

编译但会导致内存泄漏。如果从列表生成向量,则可以解决该问题。像这样:

instance (Arbitrary a) => Arbitrary (Vector a) where
  arbitrary = Vec.fromList <$> arbitrary

我仍然不知道这种错误的原因是什么......