1

我打算在 VTD 中使用 BufferReuse 功能。做了一个按要求工作的 POC。但我有一个基本的设计问题。这是我的问题陈述:我的应用程序中有近 1000 个 XML 文件,这些文件将经常被加载和解析。就像一秒钟内〜(10-20)次一样。1000 个 XML 文件的范围可以从 <1KB - ~1MB。所以为了优化代码,我想到了使用BufferReuse。

我的问题是:代码内部是否有将由 BufferReuse 功能处理的 XML 数量或 XML 集合大小的最大限制?考虑到在最坏的情况下,我将拥有 1000 MB(1000 个文件* 1MB)的 XML,它是否会过多地加载服务器?它在哪里存储这些解析的对象?我计划实现一个缓存层,它将存储每个 xmls 的 VTDNavigator(具有超时和可以缓存的最大大小)。如果我实现 bufferReuse,它实际上会对我做同样的事情还是有什么不同?

该代码最终将部署在具有非常好的规格的非常强大的服务器中。

4

2 回答 2

2

通常有以下方法来优化 VTD-XML 的性能:

  1. 空白选项 - 您可以要求 VTDGen 忽略或保留琐碎的空白字符。默认情况下,VTDGen 会丢弃那些琐碎的空白。区别主要在于内存使用。
  2. 缓冲区重用 - 您可以要求 VTDGen 为下一个解析任务重用 VTD 缓冲区。否则,默认情况下,VTDGen 将为每次解析运行分配新缓冲区。如果您正在处理类似大小的 XML 文件,这种优化技术最有用,因此 VTD 缓冲区页面大小在连续解析运行期间保持不变。
  3. 调整 LC 级别 - 默认情况下,它是 3。但您可以将其设置为 5。当您的 XML 嵌套较深时,将 LC 级别设置为 5 会产生更好的 XPath 性能。但它会非常轻微地增加内存使用和解析时间。
  4. 重用 XPath:编译/选择 XPath 是一个相对较慢的操作,尤其是当您在许多小文件上运行 XPath 表达式时。关键是从循环中取出任何 AutoPilot.selectXPath() 并通过调用 ap.resetXPath() 重用它们。
  5. 使用 VTD+XML 索引 - 您可以将 XML 预先索引为 VTD+XML 格式并将它们转储到磁盘上,而不是在处理请求时解析 XML 文件。当处理请求开始时,只需将 VTD+xml 加载到内存中,瞧,不再需要解析!
  6. 覆盖功能又名。数据模板 - 因为 VTD-XML 将 XML 原样保留在内存中,所以您实际上可以创建一个模板 XML 文件(在 vtd+xml 中预索引),其值字段留空并让您的应用程序填充空白,从而创建 XML 数据永远不需要解析。

选项 1 2 3 和 4 通常会逐步提高性能。选项 5 和 6 通过从根本上改变 XML 数据的生成和使用方式来实现范式转变,并为您提供比现有处理框架和方法潜在的巨大性能改进。一方面,您可以很容易地发现,xpath 评估的结果也可以与 VTD 索引一起保存,以实际绕过 XPath 评估。有很多方法可以改进您的应用程序,我将把它留给您的想象。

于 2015-03-03T02:49:51.583 回答
1

如果应用程序是需要立即解析 XML 的实时应用程序,那么第 5 点不是一个选项,对吧?

至于第 5 点,您能否详细说明如何将模板 XML 替换为来自传入字段的字段值?

谢谢。

于 2015-03-10T03:17:39.650 回答