Как это возможно, что GHCI отображает использованную память большего значения, чем у меня физически? - PullRequest
6 голосов
/ 07 марта 2019

Основной вопрос приходит вместе с цитатами из интерпретатора GHCI. Да, я знаю, что предполагаемое использование кода компилирует его в исполняемый файл, однако, поскольку я новичок в Haskell, GHCI кажется идеальным для изучения некоторого Haskell.

Когда я использую алгоритмы тяжелой вычислительной нагрузки, я иногда сталкиваюсь с сообщениями, подобными следующим:

Prelude Data.List> foldl' (+) 0 [1..2*10^8]
20000000100000000
it :: (Num b, Enum b) => b
(8.35 secs, 17,600,063,056 bytes)

В то же время у меня физически установлено только 8 ГБ ОЗУ.

Если использование памяти превышает определенный предел (который я не совсем уверен, сколько это, но предполагаю, что это вся память, которая может быть использована), исключение переполнения стека выдается, как показано ниже:

Prelude> foldl (+) 0 [1..5 * 10^7]
*** Exception: stack overflow

Тем не менее, как это возможно, что программа использует> 16 ГБ памяти, в то время как моя оперативная память составляет 8 ГБ и без исключения переполнения стека?

1 Ответ

7 голосов
/ 07 марта 2019

Магия сборки мусора: число, сообщаемое :set +s, которое вы показываете, показывает общее количество байтов, запрошенных у распределителя, даже если они были позже освобождены и возвращены распределителю для повторного использования до завершения вычисления.

...