Haskell的哪个XML解析器?

Ale*_*Ott 10 xml parsing haskell

我正在尝试编写一些应用程序,它执行数据分析,存储在相当大的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"))
Run Code Online (Sandbox Code Playgroud)

其中'proc' - 执行将数据从属性转换为记录的过程,以及'ioproc' - 执行某些IO操作的过程 - 输出到屏幕,存储在数据库中等.

如何在XML解析期间减少内存消耗?应该切换到另一个XML解析器帮助吗?

更新:哪个解析器支持不同的输入编码 - utf-8,utf-16,utf-32等?

Gre*_*con 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