在将数据结构从diffarray更改为vector后,在一次QuickCheck测试期间,内存会爆炸(无限增长)。
代码托管在GitHub。 dev分支包含病毒代码,主分支运行良好。除了微小的变化之外,唯一可能对此产生影响的提交是one。为了运行QuickCheck例程,应该运行可执行文件 tester 。似乎小长度向量不会使程序崩溃,但是当它变得越来越长时,程序会减慢并最终打开内存。 引起我兴趣的另一件事是我在渲染XML文件时在我的其他库中遇到了类似的问题。对于小文件(< 400k),它运行缓慢但没有崩溃,对于较大的文件,内存会爆炸。 Data.Vector也涉及该库。我有直觉这些问题是相关的。
编辑:我终于隔离了我的代码中重现内存泄漏的部分,并将其放入一个可以找到here的文件中。现在我使用的IArray表现得和DiffArray一样好。要在IArray和Vector之间切换,必须修改第49,93和101行。
答案 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
我仍然不知道这种错误的原因是什么......