gpt4 book ai didi

java - Xalan XSLT - 内存堆空间不足

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:32 26 4
gpt4 key购买 nike

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

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

糟糕的是,用户可以请求的其中一份报告仅 XML 部分就有 143MB(约 430,000 条记录)。将其转换为 HTML 时,我用完了堆空间,最大为堆保留了 4096G。这是 Not Acceptable 。

看起来问题只是数据太多了,但我忍不住想有比限制客户和不能满足功能需求更好的方法来处理这个问题。

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

谢谢

编辑

我使用的所有转换类都在 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();

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

最佳答案

XSLT 的问题在于,在进行转换时,您需要在内存中拥有整个源文档(以及结果文档)的 DOM 表示。对于大型 XML 文件,这是一个严重的问题。

您对允许流式转换的系统感兴趣,其中完整文档不必存储在内存中。也许 STX 是一种选择: http://www.xml.com/pub/a/2003/02/26/stx.html http://stx.sourceforge.net/ .它与 XSLT 非常相似,因此如果您的 XSLT 样式表以直接的方式应用于 XML,将其重写为 STX 会非常简单。

关于java - Xalan XSLT - 内存堆空间不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com