我正在尝试编写一些应用程序,对存储在相当大的XML文件中的数据进行分析(从10到800MB)。每组数据都以单个标记形式存储,具体数据指定为属性。我目前使用HaXml的saxParse,并且在与它一起工作时对内存使用不满意。在解析15Mb XML文件时,它消耗了超过1Gb的内存,尽管我试图不将数据存储在列表中并立即处理它。我使用以下代码:
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'是执行某些IO操作的过程 - 输出到屏幕,存储在数据库中等。
我如何在XML解析期间降低内存消耗?换用另一个XML解析器是否有助于解决问题?
更新:哪个解析器支持不同的输入编码 - utf-8、utf-16、utf-32等?