Por lo tanto, he jugado con varias bibliotecas Haskell XML, incluyendo hexpat y xml-enumerator. Después de leer el capítulo de IO en Real World Haskell (http://book.realworldhaskell.org/read/io.html), tenía la impresión de que si ejecutaba el siguiente código, sería basura recolectada a medida que avanzaba.Haskell analizar el archivo xml grande con poca memoria
Sin embargo, cuando lo ejecuto en un archivo grande, el uso de memoria sigue subiendo mientras se ejecuta.
runghc parse.hs bigfile.xml
¿Qué estoy haciendo mal? Es mi suposición incorrecta? ¿El mapa/filtro lo fuerza a evaluar todo?
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
Mi objetivo final es analizar un gran archivo xml con una interfaz simple similar a un saxofón. No quiero tener que estar al tanto de toda la estructura para recibir notificaciones de que he encontrado un "evento".
¿También obtiene este comportamiento al compilarlo en lugar de ejecutarlo en modo interpretado? – hammar
Y no olvide utilizar la optimización (-O2) al compilar. –
¿Tiene que compilar y optimizar para obtener basura recolectada? Si es así, me aseguraré de probar eso en el futuro –