所以,我已经使用了几个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)。 –
你是否需要编译并优化才能将其收集到垃圾回收中?如果是这样,我一定会在将来尝试 –