Haskell使用哪个XML解析器?

8

我正在尝试编写一些应用程序,对存储在相当大的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等?

2个回答

4
如果您愿意假设您的输入是有效的,请考虑查看Galois公司的TagSoupText.XML.Light
这些将字符串作为输入,因此您可以(间接)将Data.Encoding理解的任何内容提供给它们,即
ASCII UTF8 UTF16 UTF32 KOI8R KOI8U ISO88591 GB18030 BootString ISO88592 ISO88593 ISO88594 ISO88595 ISO88596 ISO88597 ISO88598 ISO88599 ISO885910 ISO885911 ISO885913 ISO885914 ISO885915 ISO885916 CP1250 CP1251 CP1252 CP1253 CP1254 CP1255 CP1256 CP1257 CP1258 MacOSRoman JISX0201 JISX0208 ISO2022JP JISX0212

3
我不是Haskell专家,但你遇到的问题听起来像是经典的空间泄漏(即,Haskell的惰性求值导致它保留了比必要更多的内存)。你可以通过强制对saxParse输出进行严格处理来解决这个问题。
还有一章关于Real World Haskell中的性能分析和优化内容。 编辑:这里找到了另一个好的资源来进行性能分析/寻找瓶颈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接