Xalan XSLT - 内存堆空间不足

And*_*ndy 5 java xslt heap xalan

我的项目有一个报告模块,它以 XML 的形式从数据库收集数据,并在其上运行 XSLT 以生成用户所需的报告格式。此时的选项是 HTML 和 CSV。

我们使用 Java 和 Xalan 与数据进行所有交互。

不好的部分是用户可以请求的这些报告之一仅为 XML 部分的 143MB(大约 430,000 条记录)。将其转换为 HTML 时,我用尽了堆空间,最多为堆保留了 4096G。这是无法接受的。

看来问题简直是数据太多了,但我不禁想到,除了限制客户,无法满足功能需求之外,还有更好的处理方式。

我很高兴根据需要提供更多信息,但我不能透露太多关于该项目的信息,因为我相信你们大多数人都理解。此外,答案是肯定的;我同时需要所有数据:我无法对其进行分页。

谢谢

编辑

我使用的所有转换类都在 javax.xml.transform 包中。实现如下所示:

final Transformer transformer = 
  TransformerFactory.newInstance().newTransformer(
    new StreamSource(new StringReader(xsl)));
final StringWriter outWriter = new StringWriter();
transformer.transform(
  new StreamSource(new StringReader(xml)), new StreamResult(outWriter));
return outWriter.toString();
Run Code Online (Sandbox Code Playgroud)

如果可能,我希望 XSLT 保持原样。StreamSource做事的方法应该允许我在处理一些数据时对它进行 GC,但我不确定 XSLT(函数等)有哪些限制,这可能需要它进行适当的清理。如果有人可以向我指出详细说明这些限制的资源,那将非常有帮助。

And*_*ndy 2

我们可以通过做两件事来改进这一点。

  1. 我们采用 XML 源和目标格式并将它们制作为临时文件。这使得初始创建和存储不占用 RAM,因为数据来自数据库并且也被写回数据库。只需要一个数据句柄即可。

  2. 使用Saxonica变压器。这允许进行一些操作,包括 SAX 样式转换和 XSLT 2.0 的使用,而 Xalan 解析器则不允许这样做。