Итак, я поигрался с несколькими 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-файл с простым интерфейсом, похожим на саксофон. Я не хочу знать обо всей структуре, чтобы получать уведомление о том, что я обнаружил «событие».