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

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

0 ответов

Другие вопросы по тегам