Я пытаюсь написать приложение, которое выполняет анализ данных, хранящихся в довольно больших XML-файлах (от 10 до 800 МБ). Каждый набор данных хранится в виде одного тега, а конкретные данные указываются как атрибуты. В настоящее время я saxParse из HaXml, и я не удовлетворен использованием памяти при работе с ним. При разборе XML-файла размером 15 МБ он потребляет более 1 ГБ памяти, хотя я старался не хранить данные в списках и обрабатывать их немедленно. Я использую следующий код:
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"))
где 'proc' - процедура, которая выполняет преобразование данных из атрибутов в запись, и 'ioproc' - процедура, которая выполняет некоторое действие ввода-вывода - вывод на экран, сохранение в базе данных и т. Д.
Как я могу уменьшить потребление памяти при разборе XML? Должно ли помочь переключение на другой анализатор XML?
Обновление: и какой синтаксический анализатор поддерживает различные входные кодировки - utf-8, utf-16, utf-32 и т. Д .?