【问题标题】:Best way to input files to Xpath将文件输入到 Xpath 的最佳方式
【发布时间】:2012-08-17 12:08:22
【问题描述】:

我正在使用 Xpath 到红色 XML 文件。一个文件的大小是未知的(在 700Kb - 2Mb 之间)并且必须每秒读取大约 100 个文件。所以我想要一种快速加载和读取 Xpath 的方法。

我尝试使用 java nio 文件通道和内存映射文件,但很难与 Xpath 一起使用。 那么有人可以告诉一种方法吗?

【问题讨论】:

  • 每秒从 Java 打开和关闭 100 个文件确实是 IO 密集型的。你在什么操作系统上(手指交叉一些*nix)?
  • 我认为使用 xpath 读取 xml 的最佳方法是使用 vtd-xml。

标签: java xpath


【解决方案1】:

很大程度上取决于 XPath 表达式的作用。这里有四个成本:读取文件的基本 I/O、XML 解析、树构建和 XPath 评估。 (加上可能的第五个,生成输出,但您没有提到输出可能是什么。)根据您的描述,我们无法知道哪个因素占主导地位。绩效改进的第一步始终是衡量,而我的第一步是尝试衡量这四个因素的贡献。

如果您处于具有多个处理器的环境中(谁不是?),那么并行执行将是有意义的。如果您可以使用 Saxon-EE 中的 collection() 函数来组织处理,则可以“免费”获得。

【讨论】:

  • 能否请您告诉我 Saxon xpath 和普通 javax.xml Xpath 之间的区别
  • 最重要的是Saxon实现了XPath 2.0。这有很多含义;一个简单的方法是它提供了 collection() 函数,该函数读取多个 XML 文件(例如,目录中的所有文件)。但是 Saxon(尤其是商业版 Saxon-EE)还有许多其他可能与您的问题相关的功能,例如流处理和并行执行。
【解决方案2】:

如果我是你,我可能会在这种情况下完全放弃 Java,不是因为你不能在 Java 中这样做,而是因为使用了一些 bash 脚本(如果你在 Unix 上) 会更快,至少这是我处理大量文件的经验告诉我的。

在 *nix 上,您有一个名为 xpath 的实用程序,正是为此。

由于您要执行大量 I/O 操作,因此拥有一个像样的 SSD 磁盘会更有帮助,然后在单独的线程中执行。您仍然需要使用多个线程来执行此操作,但每个 CPU 不超过一个。

【讨论】:

    【解决方案3】:

    如果您想要性能,我会完全放弃 XPath 并使用 SAX 解析器来读取文件。您可以在 Stackoverflow 中搜索 SAX、XPath 和 DOM 类型的问题,以获取更多详细信息。这是一个Is XPath much more efficient as compared to DOM and SAX?

    【讨论】:

    • Xpath 是否在开始查询之前将整个文件加载到内存中?
    • 糟糕的答案。我们不知道 XPath 在做什么,所以我们不知道 (a) XPath 用 Ja​​va/SAX 重写有多容易,或者 (b) XPath 评估相对于 XML 解析的成本有多高。投反对票。
    • @Michael K:是的,我不知道它对 XPath 做了什么,因为问题中没有提到它。所以我的回答是基于我对 XPath 的一般经验。 XPath 非常适合您只需要查询几个特定项目,但是当您需要执行大量查询或只是读取整个文件时,它的速度比 SAX 慢。他还提到他需要每秒读取大约 100 个文件,因此性能对他来说很重要。我知道您推荐 Saxon-EE(贵公司的产品)作为加快速度的可能解决方案,但您没有提到它不是免费的。
    • @Prasad:是的,它会在运行任何查询之前将整个文件加载到内存中。如果您可以发布示例 XML 文件和用于读取 XML 文件的代码,我也许可以通过修改后的 SAX 代码给您一个可靠的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多