我正在尝试编写一些应用程序,它执行数据分析,存储在相当大的XML文件中(从10到800MB)。每组数据都存储为单个标记,具体数据指定为attrobutes。我目前是来自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等?
答案 0 :(得分:5)
如果您愿意假设您的输入有效,请考虑查看Galois人员的TagSoup或Text.XML.Light。
这些将字符串作为输入,因此您可以(间接)向它们提供Data.Encoding所理解的任何内容,即
答案 1 :(得分:3)
我不是Haskell专家,但你遇到的事情听起来像是经典的空间泄漏(即Haskell的懒惰评估导致它保留的内存超过必要的情况)。您可以通过强制saxParse输出的严格性来解决它。
中还有一个关于分析和优化的好章节编辑:找到关于分析/发现瓶颈here的另一个好资源。