Haskell анализирует большой xml-файл с нехваткой памяти

Итак, я поигрался с несколькими XML-библиотеками Haskell, включая hexpat и xml-перечислитель. После прочтения главы IO в Real World Haskell (http://book.realworldhaskell.org/read/io.html) у меня сложилось впечатление, что если я запущу следующий код, он будет собираться мусором, когда я его просматриваю.

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

runghc parse.hs bigfile.xml

Что я делаю не так? Мое предположение неверно? Заставляет ли карта / фильтр все оценивать?

import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.UTF8 as U
import Prelude hiding (readFile)
import Text.XML.Expat.SAX 
import System.Environment (getArgs)

main :: IO ()
main = do
    args <- getArgs
    contents <- BSL.readFile (head args)
    -- putStrLn $ U.toString contents
    let events = parse defaultParseOptions contents 
    mapM_ print $ map getTMSId $ filter isEvent events

isEvent :: SAXEvent String String -> Bool 
isEvent (StartElement "event" as) = True
isEvent _ = False

getTMSId :: SAXEvent String String -> Maybe String
getTMSId (StartElement _ as) = lookup "TMSId" as

Моя конечная цель - разобрать огромный XML-файл с простым интерфейсом, похожим на саксофон. Я не хочу знать обо всей структуре, чтобы получать уведомление о том, что я обнаружил «событие».

6
задан skaffman 9 May 2012 в 09:45
поделиться