我可以使用 Saxon 将 XQuery 编译成包吗 - 或者 - 如何最小化编译时间
Can I compile an XQuery into a package using Saxon - or - how to minimize compile times
我正在使用 dotnet Saxon9ee-api。
我有一个非常大的模式(180,000 行)和一个模式感知 XQuery。
当我编译它时,编译它需要几秒钟是可以理解的。这就是生活。
但是有没有一种方法可以编译一次,并将其作为编译实体序列化到磁盘?以便我稍后可以再次加载并使用它?
(XSLT 编译器允许我编译成 XsltPackages,我很确定会让我用 XSLT 做这个)。
Saxon 中没有用于已编译 XQuery 代码的文件存储格式(与 XSLT 不同),但有用于已编译模式的文件存储格式(SCM 格式),这可能会有所帮助。但是,加载这么大的模式不会是瞬间的。
请注意,XSD 模式的编译时间可能对模式的实际内容非常敏感。特别是,大的有限边界可能非常昂贵(例如 maxOccurs="1000")。这是由于用于将语法转换为有限状态机的算法。 Saxon 针对某些情况优化了教科书算法,但并非针对所有情况。有限状态机保存在 SCM 文件中,因此从 SCM 文件加载不会产生成本;然而,计算成本高昂的 FSM 也往往非常大,所以如果您处于这种情况,SCM 会很大,因此读取速度会变慢。
我正在使用 dotnet Saxon9ee-api。
我有一个非常大的模式(180,000 行)和一个模式感知 XQuery。
当我编译它时,编译它需要几秒钟是可以理解的。这就是生活。
但是有没有一种方法可以编译一次,并将其作为编译实体序列化到磁盘?以便我稍后可以再次加载并使用它?
(XSLT 编译器允许我编译成 XsltPackages,我很确定会让我用 XSLT 做这个)。
Saxon 中没有用于已编译 XQuery 代码的文件存储格式(与 XSLT 不同),但有用于已编译模式的文件存储格式(SCM 格式),这可能会有所帮助。但是,加载这么大的模式不会是瞬间的。
请注意,XSD 模式的编译时间可能对模式的实际内容非常敏感。特别是,大的有限边界可能非常昂贵(例如 maxOccurs="1000")。这是由于用于将语法转换为有限状态机的算法。 Saxon 针对某些情况优化了教科书算法,但并非针对所有情况。有限状态机保存在 SCM 文件中,因此从 SCM 文件加载不会产生成本;然而,计算成本高昂的 FSM 也往往非常大,所以如果您处于这种情况,SCM 会很大,因此读取速度会变慢。