【问题标题】:Which XML parser for Haskell?Haskell 的哪个 XML 解析器?
【发布时间】:2010-11-06 02:15:48
【问题描述】:

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

【问题讨论】:

    标签: xml haskell parsing


    【解决方案1】:

    我不是 Haskell 专家,但是您遇到的问题听起来像是典型的空间泄漏(即 Haskell 的惰性求值导致它保留了不必要的更多内存的情况)。您可以通过对 saxParse 输出强制严格来解决它。

    Real World Haskell.也有很好的剖析和优化章节

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

    【讨论】:

      【解决方案2】:

      如果您愿意假设您的输入是有效的,请考虑查看 Galois 人员的 TagSoupText.XML.Light

      这些将字符串作为输入,因此您可以(间接)向它们提供Data.Encoding 理解的任何内容,即

      • ASCII
      • UTF8
      • UTF16
      • UTF32
      • KOI8R
      • KOI8U
      • ISO88591
      • GB18030
      • 引导字符串
      • 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2013-07-13
        • 2010-11-27
        • 2012-03-18
        • 2011-10-26
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多