因此,我使用了几个 Haskell XML 库,包括 hexpat 和 xml-enumerator。在阅读了 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
我的最终目标是用一个简单的类似 sax 的界面来解析一个巨大的 xml 文件。我不想知道整个结构才能得到通知我发现了一个“事件”。