そこで、hexpat や xml-enumerator など、いくつかの Haskell XML ライブラリをいじってみました。Real World Haskell (http://book.realworldhaskell.org/read/io.html) の IO の章を読んだ後、次のコードを実行するとガベージ コレクションが行われるという印象を受けました。
ただし、大きなファイルで実行すると、実行中にメモリ使用量が増え続けます。
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 ファイルを解析することです。「イベント」を見つけたという通知を受け取るために、構造全体を意識する必要はありません。