Haskell Alex: базовый лексер утечек памяти
Я пытаюсь написать простой лексер, который будет печатать все слова на входе, где слово является максимальной последовательностью букв a-zA-Z
, Все остальные символы должны игнорироваться.
Моя программа Алекс для этого, которая использует basic-bytestring
Обертка использует столько же памяти, сколько размер ввода. Я ожидал бы, что это будет работать в постоянной памяти.
Профиль кучи с помощью -hc
просто показывает один блок закрепленной памяти, быстро увеличивающийся до размера входа и затем медленно уменьшающийся до 0.
Интересно при использовании basic
обертка и обычные строки используются только постоянная память.
Входной файл Alex
{
module Main where
import Data.ByteString.Lazy as B
}
%wrapper "basic-bytestring"
$letters = [a-zA-Z]
$nonletters = [~$letters\n]
tokens :-
$nonletters+ ;
$letters+ {B.copy}
{
main = do
buf <- B.getContents
let toks = alexScanTokens buf
mapM_ B.putStrLn toks
}
При запуске с входом размером 10M выход +RTS -s
является
2,924,029,784 bytes allocated in the heap
7,869,696 bytes copied during GC
9,958,560 bytes maximum residency (5 sample(s))
1,423,704 bytes maximum slop
22 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 5634 colls, 0 par 0.06s 0.05s 0.0000s 0.0002s
Gen 1 5 colls, 0 par 0.00s 0.00s 0.0004s 0.0011s
INIT time 0.00s ( 0.00s elapsed)
MUT time 2.79s ( 2.81s elapsed)
GC time 0.06s ( 0.06s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 2.85s ( 2.86s elapsed)
%GC time 2.0% (1.9% elapsed)
Alloc rate 1,047,072,808 bytes per MUT second
Productivity 98.0% of total user, 97.6% of total elapsed
Я был бы признателен за любую помощь в том, где я иду не так или как я могу продолжить расследование этой проблемы.