【问题标题】:Fastest possible XML handling in Delphi for very large documents在 Delphi 中对超大型文档进行最快的 XML 处理
【发布时间】:2008-11-05 00:41:51
【问题描述】:

我需要关于在 Delphi 中使用什么(我使用 Delphi 2009)以尽可能快地处理非常大的 XML 文件(例如 100 MB)的建议。

我需要输入 XML,从我的程序中访问和更新其中的数据,然后再次导出修改后的 XML。

希望输入和输出可以在快速的 Windows 机器上在几秒钟内完成。


澄清。我预计我将需要使用 DOM,因为访问用于开发报告和更新数据的数据结构很重要,并且我需要此功能非常快速。

输入只为文件加载完成一次,输出只为文件保存完成,通常只在退出时完成一次。这些也应该很快,但不如内存中的数据访问和更新重要。

我的理解是,第 3 方解析器仅对输入和输出有帮助,而不是在加载到内存后使用和修改数据。还是我弄错了?

【问题讨论】:

    标签: xml delphi delphi-2009 large-files


    【解决方案1】:

    如果我正确理解了您的问题,您已经知道数据结构并且您正在修改数据 - 而不是文件的 XML 结构。

    在这些条件下并且如果性能至关重要,那么您可以尝试直接进行文本操作 - 跳过 XML 解析。

    从流中读取,使用一些快速的文本搜索算法,例如Boyer-Moore,找到需要修改数据的地方,进行修改并将数据输出到另一个流中。

    这将是一次性的,没有 XML 解析,没有内存中的 XML 树构建。

    【讨论】:

    • 其实,当程序启动时,我想将数据输入到内存数据结构中。然后,当它运行时,我将多次访问该数据以进行各种操作,包括允许用户更新数据。关闭时,用户可能想要保存他的更新。
    • ...但我最终使用了您推荐的直接文本操作,这绝对是您可以获得的最快速度。所以我给你接受的答案。
    【解决方案2】:

    SAX 值得考虑,而不是 DOM 解析器。

    使用 DOM,您需要支付加载文档的开销,但一旦加载数据,就可以快速访问和更新。

    使用 SAX,您必须为开始元素、结束元素等编写处理程序,但您在进行操作时拥有更大的灵活性。

    虽然它可能对您的情况没有帮助,但 SAX 在您搜索时非常有用,因为您可以随时停止解析,因此一旦找到您想要的内容,您就可以停止。

    如果您的程序在知道要进行哪些更改之前不需要解析所有数据,您可以编写 SAX 处理程序,在读取数据时更新数据,否则将其传递,因此它会流式传输数据而不是而不是必须将其全部加载到任何类型的内存结构中。这将使解决方案非常可扩展,因为您不会遇到非常大的文件的内存限制。

    不管怎样,我倾向于使用 MSXML DOM 和 SAX 解析器。可以说它们不是表现最好的,我认为可能有更多的人在努力改进它们,所以它们会越来越好。

    【讨论】:

      【解决方案3】:

      我对 SimDesign 的NativeXML 非常满意。它还包括一个名为 FastXML 的特殊版本,我尚未对其进行测试,但据说它很快。

      【讨论】:

        【解决方案4】:

        您可能想看看DIHtmlParser component from The Delphi Inspiration。它应该是“非常快的,尤其是在解析大文件时”,并且“在现代机器上,分数上升到每秒超过 15 MB 的 HTML 数据”。尽管我从未尝试过处理大文件,但我在这方面有过一些不错的体验。

        【讨论】:

        • 我已经在超大 (> 100 MB) XHTML 日志文件上使用了它,没有任何问题。
        【解决方案5】:

        我不是专家,但我相信大家的共识是 SAX 解析器将比 DOM 高效得多...

        【讨论】:

          【解决方案6】:

          如果您考虑过事件驱动的 SAX 方式,XML Parser library 可能会派上用场。

          【讨论】:

            【解决方案7】:

            我刚刚发现的另一种可能性是我购买的LMD ElPack package,它们包含一个 XML 支持库,他们说“速度非常快,完全支持 unicode,并且只为您的 Exe 文件增加了很小的空间”。

            查看 LMD 7 包(用于 Delphi 2009)中包含的 LMDXML.pas 单元的源代码,该代码基于 Michail Vlasov 的 SimpleXML Release 8.0(2006 年 7 月)代码。

            【讨论】:

              【解决方案8】:

              如果您只需要直接操作,我会同意 zendar 的回答。

              至于 DOM 或 SAX 实现,我推荐DIXml

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-10-04
                • 2020-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多