Космические утечки в Хаскеле - PullRequest
18 голосов
/ 14 октября 2011

Я много раз читал, что ленивая оценка в Хаскеле может иногда приводить к утечкам из космоса.Какой код может привести к утечке пространства?Как их обнаружить?И какие меры предосторожности могут быть приняты программистом, чтобы избежать их?

Ответы [ 2 ]

12 голосов
/ 14 октября 2011

Вы получите, вероятно, много ответов, с этим я столкнулся, пытаясь создать какое-то «реальное» приложение. Я использовал многопоточность и некоторые MVars для передачи данных (MVar - это что-то вроде заблокированной общей памяти). Мой типичный образец был:

a <- takeMVar mvar
putMVar mvar (a + 1)

А потом, просто иногда, когда возникало правильное состояние, я делал что-то вроде:

a <- takeMVar mvar
when (a > 10) ....

Проблема в том, что содержание mvar было по существу (0 + 1 + 1 + 1 + ....) ... которое было довольно интенсивным для чисел типа 100k ... Этот тип проблемы был довольно распространенным в моей код; к сожалению, для многопоточных приложений очень легко попасть в такие проблемы.

Обнаружение ... то, что я делал, запускало haskell в режиме, который выдает данные о потреблении памяти, запускает и останавливает различные потоки и проверяет, стабильно ли занимаемая память или нет ...

Анотомия протечки (с инструкциями по ее устранению)

Пример: Утечка памяти в результате функции карты

4 голосов
/ 21 октября 2011

Я столкнулся с этой проблемой при выполнении рекурсии для больших структур данных. Сложившихся громов становится слишком много, и тогда вы получаете космическую утечку.

В Haskell вам нужно постоянно знать о возможности столкновения с космической утечкой. Поскольку итерации не существует, практически любая рекурсивная функция может генерировать утечку пространства.

Чтобы избежать этой проблемы, запомните рекурсивные функции или переписайте их хвост-рекурсивно.

...