7

この単純なパーサーが大きなファイルに対してメモリ不足になる理由を理解したいと思います。私は何が間違っているのか本当にわかりません。

import Data.Attoparsec.ByteString.Char8
import qualified Data.Attoparsec.ByteString.Lazy as Lazy
import System.Environment
import qualified Data.ByteString.Lazy as B
import Control.Applicative

parseLine :: Parser String
parseLine = manyTill' anyChar (endOfLine <|> endOfInput)

parseAll :: Parser [Int]
parseAll = manyTill' 
        (parseLine >> (return 0)) -- discarding what's been read
        endOfInput

main :: IO()
main = do 
        [fn] <- getArgs
        text <- B.readFile fn

        case Lazy.parse parseAll text of
                Lazy.Fail _ _ _ -> putStrLn "bad"
                Lazy.Done _ _ -> putStrLn "ok" 

私はプログラムを実行しています:

 runhaskell.exe test.hs x.log

出力:

test.hs: Out of memory

x.log のサイズは約 500MB です。私のマシンには 16GB の RAM があります。

4

2 に答える 2