所以,我已經使用了幾個Haskell XML庫,包括hexpat和xml-enumerator。在閱讀Real World Haskell中的IO章節後(http://book.realworldhaskell.org/read/io.html),我的印象是,如果我運行下面的代碼,它會在我經歷它時收集垃圾。Haskell解析低內存的大xml文件
但是,當我在大文件上運行它時,內存使用量在運行時會不斷攀升。
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文件。我不想讓整個結構知道我發現了一個「事件」。
編譯它而不是在解釋模式下運行時,你是否也得到這種行爲? – hammar
編譯時不要忘記使用優化(-O2)。 –
你是否需要編譯並優化才能將其收集到垃圾回收中?如果是這樣,我一定會在將來嘗試 –