Утечка памяти при переходе из DiffArray в Data.Vector - PullRequest
1 голос
/ 21 марта 2012

После изменения структуры данных с diffarray на vector память взрывается (увеличивается бесконечно) во время одного из тестов QuickCheck.

Код размещен на GitHub . В ветке dev содержится плохой код, а основной работает хорошо. Помимо незначительных изменений, единственный коммит, который может на это повлиять, это один . Для запуска процедур QuickCheck необходимо запустить исполняемый файл tester . Кажется, что векторы небольшой длины не приводят к сбою программы, но когда она становится длиннее, программа замедляется и, наконец, увеличивает объем памяти. Другая вещь, которая меня заинтриговала, это то, что у меня возникла похожая проблема в других моих библиотеках при рендеринге файлов XML. Для маленьких файлов (<400 КБ) он работает медленно, но без сбоев, а для больших файлов память взрывается. Data.Vector также участвует в этой библиотеке. У меня есть интуиция, эти проблемы связаны. </p>

Редактировать: Я наконец выделил часть своего кода, которая воспроизводит утечку памяти, и поместил ее в один файл, который можно найти здесь . Теперь я использую IArray, который ведет себя так же, как и DiffArray. Чтобы чередовать IArray и Vector, нужно изменить строки 49, 93 и 101.

1 Ответ

2 голосов
/ 21 марта 2012

Решено На самом деле проблема заключалась в генерации векторов 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

Я до сих пор не знаю, в чем причина такой ошибки ....

...