Estoy tratando de escribir alguna aplicación que realice análisis de datos almacenados en archivos XML bastante grandes (de 10 a 800 MB). Cada conjunto de datos se almacena como una sola etiqueta, con datos concretos especificados como attrobutes. Actualmente soy saxParse de HaXml, y no estoy satisfecho con el uso de memoria durante el trabajo con él. Al analizar el archivo XML de 15Mb, consume más de 1 Gb de memoria, aunque traté de no almacenar datos en las listas y procesarlo inmediatamente. Yo uso siguiente código:¿Qué analizador XML para 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"))
donde 'proc' - procedimiento, que realiza la conversión de datos de atributos en el expediente, y 'IOProc' - procedimiento, que se realiza alguna acción IO - salida a la pantalla, el almacenamiento de la base de datos, etc.
¿Cómo puedo disminuir el consumo de memoria durante el análisis XML? ¿Debería cambiar a otro analizador XML?
Actualización: ¿y qué analizador es compatible con diferentes codificaciones de entrada - utf-8, utf-16, utf-32, etc.?