Sto provando a scrivere un'applicazione, che esegue l'analisi dei dati, archiviata in file XML piuttosto grandi (da 10 a 800 MB). Ogni set di dati viene memorizzato come tag singolo, con dati concreti specificati come attrobutes. Attualmente sono saxParse di HaXml e non sono soddisfatto dell'utilizzo della memoria durante il lavoro con esso. Analizzando il file XML da 15 Mb consuma più di 1 GB di memoria, sebbene abbia tentato di non memorizzare i dati negli elenchi e di elaborarli immediatamente. Io uso seguente codice:Quale parser XML per Haskell?
importOneFile file proc ioproc = do
xml <- readFile file
let (sxs, res) = saxParse file $ stripUnicodeBOM xml
case res of
Just str -> putStrLn $ "Error: " ++ str;
Nothing -> forM_ sxs (ioproc . proc . (extractAttrs "row"))
dove 'proc' - procedura, che esegue la conversione dei dati da attributi in record e 'IOProc' - procedura, che esegue una certa azione IO - output a schermo, la memorizzazione nel database, ecc.
Come posso ridurre il consumo di memoria durante l'analisi XML? Dovresti passare a un altro parser XML?
Aggiornamento: e quale parser supporta per diverse codifiche di input - utf-8, utf-16, utf-32, ecc.?