我正在研究在XSL中使用流式传输的用例。我知道两种明确的情况:在早期退出之外的小文档上进行XSL流处理的用例?
答:您需要转换一个非常大的文档,其整个内容不能保存在内存中。 B.您只需要文档的一小部分,并且通常“小部分”靠近顶部。然后,您可以通过提前退出节省时间。
我写信问,如果在实践中,存在第三实际使用案例:
C.你有一个简单的转换,想放弃构建XML树所需的CPU时间。 举个例子,假设一个商店的出货量都存储在以下格式的XML结构:
顶级=年
2级=月
3级=日装运
的在装运4级=货物ID
5级=个别项目
菊为了举例,考虑一种转换,其目的是在“月”级别提取信息......只需要存储在月份元素的属性中的数据,并且不需要关于这些节点的后代的任何信息。
即使必须阅读整个文档,这种转换是否有可能从流式传输中受益?我希望有一段时间可以获得,因为不需要建造树木,但是在我有限的测试中,似乎并非如此。
我在SAXON 9.5.1.3中试过这样一个例子,流式传输比非流式传输例子慢了20%左右。 也许执行流式处理所涉及的开销几乎总是会比没有构建树的时候更糟? (至少在SAXON,树木建设速度非常快)
或者我在测试中犯了一个错误,并且有清晰的例子说明流式更有效率,即使整个文档都要被读取?
我可能会继续偶尔尝试一下,我会告诉你,如果我最终发现一个真实的案例,我的真实生活中的一个分析最终会因为放弃树木而受益。实际上,我的工作通常只有很少的序列化成本,因为我使用XSL分析数据而不是转换数据。 [我宁愿使用本地XPath3的语言,而不是将所有内容都转换为PyTables ...] –
另一种降低内存需求的情况当然是当您拥有大量小文档而不是单个大文档时。这可能是使用collection()的批处理过程,也可能是进行大量转换的高吞吐量Web服务。 –