Tak, grałem z kilkoma bibliotekami Haskell XML, w tym heksagonalnym i xml-enumeratorem. Po przeczytaniu rozdziału IO w realnym świecie Haskella (http://book.realworldhaskell.org/read/io.html) miałem wrażenie, że jeśli uruchomię poniższy kod, będzie on zbiorem śmieci podczas jego przechodzenia.Haskell parsować duży plik xml z małą pamięcią
Jednak, gdy uruchomię go na dużym pliku, użycie pamięci stale rośnie, gdy działa.
Co robię źle? Czy moje założenie jest błędne? Czy mapa/filtr wymusza na niej ocenę wszystkiego?
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
Moim celem końcowym jest przeanalizowanie ogromnego pliku xml za pomocą prostego interfejsu podobnego do sax. Nie chcę być świadomy całej struktury, aby otrzymać powiadomienie, że znalazłem "wydarzenie".
Czy to zachowanie występuje również podczas kompilacji, zamiast uruchamiać je w trybie zinterpretowanym? – hammar
I nie zapomnij użyć optymalizacji (-O2) podczas kompilacji. –
Czy musisz skompilować i zoptymalizować, aby uzyskać go do zbierania śmieci? Jeśli tak, to na pewno spróbuję tego w przyszłości. –