所以,我已经尝试过几个Haskell XML库,包括hexpat和xml-enumerator。在阅读了《Real World Haskell》中的IO章节(http://book.realworldhaskell.org/read/io.html)后,我认为如果运行以下代码,则会在使用过程中进行垃圾回收。
然而,当我在大文件上运行它时,内存使用量会随着运行而不断增加。
runghc parse.hs bigfile.xml
我错在哪里呢?我的假设是错误的吗?map/filter是否强制评估所有内容?
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文件。我不想意识到整个结构,只需收到“事件”通知即可。