Haskell的哪个XML解析器?

时间:2009-06-26 09:03:15

标签: xml haskell parsing

我正在尝试编写一些应用程序,它执行数据分析,存储在相当大的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等?

2 个答案:

答案 0 :(得分:5)

如果您愿意假设您的输入有效,请考虑查看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

答案 1 :(得分:3)

我不是Haskell专家,但你遇到的事情听起来像是经典的空间泄漏(即Haskell的懒惰评估导致它保留的内存超过必要的情况)。您可以通过强制saxParse输出的严格性来解决它。

Real World Haskell.

中还有一个关于分析和优化的好章节

编辑:找到关于分析/发现瓶颈here的另一个好资源。