1

データ構造をdiffarrayからvectorに変更した後、QuickCheck テストのいずれかでメモリが爆発 (無限に増加) します。

コードはGitHubでホストされています。開発ブランチには問題のあるコードが含まれており、マスター ブランチは正常に動作します。マイナーな変更を除けば、それに影響を与える可能性がある唯一のコミットは this oneです。QuickCheck ルーチンを実行するには、実行可能なテスターを実行する必要があります。小さい長さのベクトルはプログラムをクラッシュさせないようですが、長くなるとプログラムの速度が低下し、最終的にメモリが爆発します。私が興味をそそられるもう 1 つのことは、XML ファイルのレンダリング中に、他のライブラリで同様の問題が発生しているという事実です。小さなファイル (<400k) の場合、実行速度は遅くなりますがクラッシュはなく、大きなファイルの場合はメモリが爆発します。Data.Vector もそのライブラリに含まれています。私はこれらの問題が関連しているという直感を持っています。

編集:メモリ リークを再現するコードの一部を最終的に分離し、ここにある 1 つのファイルにまとめました。現在、DiffArray と同様に動作する IArray を使用しています。IArray と Vector を切り替えるには、49、93、101 行目を変更する必要があります。

4

1 に答える 1

2

解決済み実際、問題はQuickCheckによるベクトルの生成にありました。Vectorの元の任意のインスタンスは次のとおりです。

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

これはコンパイルされますが、メモリリークが発生します。ベクトルがリストから生成される場合、問題は解決できます。このような:

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

そのようなバグの原因が何だったのか、私にはまだわかりません。

于 2012-03-21T14:23:36.133 に答える