内存有效的XSLT处理器

我需要一个工具来执行XSLT对非常大的 XML文件。清楚的是,我不需要任何设计,编辑或调试XSLT,只需执行它们即可。我正在使用的转换已经很好的优化,但大文件导致我尝试过的工具(Saxon v9.1)耗尽内存。内存有效的XSLT处理器

回答:

我找到了一个很好的解决方案:Apache的Xalan C++。它提供了一个pluggable memory manager,允许我根据输入和变换调整分配。

在多数情况下,它比我尝试过的其他内存消耗少60%(我正在查看私有字节)。

回答:

看看Xselerator

回答:

我发现,自定义工具建成运行使用早期版本的MSXML使得它的XSLT 非常快,但也消耗了难以置信的大量的内存,并不会真正完成如果它太大。由于早期版本的MSXML不支持完整的xpath,因此您也会失去一些高级XSLT功能。

如果您的其他选项耗时过长,值得一试。

回答:

这是一个有趣的问题。 XSLT可能会针对空间进行优化,但我期望除了最晦涩的实现之外的所有其他实现都将源文档解析为DOM,而DOM一定会在内存中使用文档大小的低倍数。

除非样式表特别设计为支持单通转换,否则合理的时间性能可能需要将源文档解析为基于磁盘的分层数据库。

虽然我没有答案。

回答:

这听起来像你排序 - 但通常,另一种可能的方法是首先拆分数据。显然,这只适用于某些转换(即不同的数据块可以与整体隔离) - 但是可以使用简单的解析器(而不是DOM)来分割成可管理的块,然后处理每个块分开并重新组装。

因为我是.NET bod,所以像XmlReader这样的东西可以在没有DOM的情况下进行分块;我确定每种语言都有相应的内容。

再次 - 只是为了完整性。

[编辑问题] 我不知道任何具体的名称;也许Divide and Conquer。 举个例子;如果您的数据实际上是一个类似对象的平面列表,那么您可以简单地拆分一级子级,即不是分成2M行,而是将其分为10个200K行或100个20K行。在处理大量数据(例如,上传大量数据[全部有效]并在服务器上重新组装以便每个单独的上传足够小以保证可靠)之前,我已经做了很多次。

回答:

您使用的是Saxon的Java版本还是.Net端口?如果内存不足(使用-Xms命令行参数),则可以为运行Saxon的Java VM分配更多内存。

我也发现SaXon的.Net版本内存不如Java版本容易耗尽内存。

回答:

您可能想要查看STX以进行基于流的XSLT转换。或者,我相信StAX可以通过Transformer界面integrate with XSLT nicely。

回答:

对于什么是值得的,我怀疑对于Java来说,如果您需要使用XSLT,Saxon就像它一样好。对于较大的文档而言,它非常高效(包括cpu和内存),但XSLT本身强制要求创建和保留完整的内存中目录树,但有限的情况除外。 Saxon-SA(收费版本)据说具有扩展功能,可以利用这种“流式”情况,因此可能值得一试。

但分裂内容的建议是最好的一个:如果你正在处理独立的记录,只需拆分使用其他技术(如,使用Stax的:-)!)

回答:

对于.NET输入你可以在Microsoft知识库使用的解决方案建议: http://support.microsoft.com/kb/307494

XPathDocument srcDoc = new XPathDocument(srcFile); 

XslCompiledTransform myXslTransform = new XslCompiledTransform();

myXslTransform.Load(xslFile);

using (XmlWriter destDoc = XmlWriter.Create(destFile))

{

myXslTransform.Transform(srcDoc, destDoc);

}

回答:

看来,撒克逊9.2可以提供一个答案,你的问题。如果您的文档可以在不使用谓词的情况下进行转换(不引用当前节点的任何兄弟节点),则可以使用Streaming XSLT。 请参阅this link

我没有尝试过这个我自己,我只是阅读它。但我希望它能起作用。

以上是 内存有效的XSLT处理器 的全部内容, 来源链接: utcz.com/qa/265332.html

回到顶部