gpt4 book ai didi

java - 将样式表应用到 xml 文档的内存消耗最少的方法是什么?

转载 作者:行者123 更新时间:2023-12-02 07:33:33 24 4
gpt4 key购买 nike

假设我有一个以 byte[] 形式加载的 XML 文档,大小为 5MB。作为一个字节数组,它占用了 5MB 的内存。我有一个样式表 Source ,我想将其应用于此文档并执行如下所示的操作。

final TransformerFactory transformerFactory = TransformerFactory.newInstance();
final Transformer transformer = transformerFactory.newTransformer(styleSheet);

transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

final StringWriter writer = new StringWriter();

transformer.transform(convertStringToSource(filePayload), new StreamResult(writer));

return writer.getBuffer().toString().getBytes();

当在服务器(WebSphere App Server 7 - 对连续内存分配有限制)上运行时,我得到堆转储,表明创建了 10 - 15 MB 的对象。我认为transform()方法将在内部创建一个对象,将原始xml存储为对象,将样式表存储为对象,将结果存储为对象。将它们加在一起,至少有 2*input+stylesheet MB。有没有更有效的方法来做到这一点,使我的足迹最小化?

您可能会说 - 它只有 10MB,但就我而言,性能至关重要。当我必须一次转换数百或数千个文档时,分配这么多连续内存所需的时间就会增加。因此,我们的服务器管理员将此限制设置为警告,表明正在分配的内存超出了建议的内存。

仅供引用,以下 JVM 参数在 WebSphere 中对此进行设置:-Xdump:stack:events=allocation,filter=#5m​

最佳答案

原始 XML 大小和内存树大小之间的 3 倍扩展当然是正常的;事实上它很低。例如,参见http://dev.saxonica.com/blog/mike/2012/09/

流式转换对于有限类别的转换开始成为可能。例如,参见http://www.saxonica.com/documentation/sourcedocs/streaming.xml 。但是,当您的文档大小只有 5Mb 时,我不确定这是否适合您,至少在没有进一步证据的情况下是这样。

在我看来,您已经得出这样的结论:XSLT 处理器的内存分配是影响工作负载性能的关键因素,但没有任何真正的证据表明情况确实如此。例如,看看转换时间与解析时间的关系会很有趣 - 许多人惊讶地发现,有时转换成本与解析成本相比很小。在解决系统性能的某一方面之前,您需要找出真正的瓶颈是什么。

关于java - 将样式表应用到 xml 文档的内存消耗最少的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606384/

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