English 中文(简体)
在Delphi中对于非常大的XML文档进行最快速的处理。
原标题:
  • 时间:2008-11-05 00:41:51
  •  标签:

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

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

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


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

输入仅在文件加载时执行一次,输出仅在文件保存时执行,通常只在退出时执行一次。这些操作应该也很快,但不像在内存中访问和更新数据那样重要。

我的理解是,第三方解析器只能帮助输入和输出,但不能在加载到内存后使用和修改数据。或者我对此有误吗?

最佳回答

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

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

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

这将是一次遍历,无需XML解析,无需在内存中构建XML树。

问题回答

SAX与DOM解析器相比值得考虑。

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

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

尽管这可能对你的情况没有帮助,但 SAX 在搜索时非常有用,因为你可以在任何时刻停止解析,因此一旦你找到了想要的内容,就可以停止。

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

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

我非常满意SimDesign的NativeXML。它还包括一个称为FastXML的特殊版本,我还没有测试过,但据说速度非常快。

你可能想看看来自Delphi Inspiration的DIHtmlParser组件。据说它在解析大型文件时“非常快”,“在现代计算机上,每秒可以处理超过15 MB的HTML数据”。我对它有一些很好的体验,尽管我从未尝试过处理大型文件。

我不是专家,但我认为共识是SAX解析器比DOM解析器更有效率...

如果您考虑事件驱动的SAX方式,XML解析器库可能非常实用。

我刚刚发现的另一个可能性是使用我购买的LMD ElPack套餐,他们包含一个XML支持库,他们说它“非常快,完全支持Unicode,并且仅添加了一个小占用到您的Exe文件。”

观察他们在LMD 7包(适用于Delphi 2009)中包含的LMDXML.pas单元的源代码,它表明代码是基于Michail Vlasov发布于2006年7月的SimpleXML Release 8.0代码。

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

关于DOM或SAX实现,我推荐使用DIXml





相关问题
热门标签