4

入力内のすべての単語を出力する単純なレクサーを作成しようとしています。ここで、単語は文字の最大シーケンスですa-zA-Z。他のすべての文字は無視する必要があります。

ラッパーを使用するこのための私のAlexプログラムbasic-bytestringは、入力のサイズと同じくらい多くのメモリを使用します。私はそれが一定のメモリで実行されることを期待していたでしょう。

を使用したヒープ プロファイル-hcは、ピン留めされたメモリの 1 つのブロックが急速に入力のサイズに増加し、その後ゆっくりと 0 に減少していることを示しています。

興味深いことに、basicラッパーと通常の文字列を使用すると、定数メモリのみが使用されます。

アレックスの入力ファイルは

{
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

どこが間違っているか、またはこの問題をさらに調査する方法について助けていただければ幸いです。

4

0 に答える 0