【问题标题】:Creating and saving large XMLs in Java在 Java 中创建和保存大型 XML
【发布时间】:2011-11-22 08:18:49
【问题描述】:

我正在开发一个 java 应用程序,其工作是创建和保存 XML(大尺寸)。我得到的样本是 300 MB XML 文件。

该应用程序旨在从数据库中收集大量数据并将其保存为 XML 格式。该应用程序因其大量的 IO 和内存使用而被设计为并行处理 MAX 3 此类请求。

现在的要求是使其并行处理多达 50 个此类请求。当前应用程序使用 XMLbean 创建 XML,然后将其保存到文件系统。该应用程序在 weblogic 服务器上作为 Web 服务公开(它在 64 位操作系统和 Java MAX 堆大小 id 4 GB 上)。

我需要你的意见:

1) 是否有与 XSD 一起使用的 XML API,可用于以最小开销创建 200-200 MB 的大型 XML? XMLbean 对我们来说工作得很好,但是有什么东西可以更好地处理它吗?

2) 将它保存到文件系统的最佳和最节省内存的方法是什么? - 我正在考虑将当前写入器更改为 bufferedWriter 并让它在物理写入磁盘之前将 1024 字节保存到内存中。 - 增加它有什么副作用吗?

3) 如果对技术选择和服务器等没有限制 - 理想的解决方案是什么!!!

EDIT 1# 数据库访问速度很快(大约占总时间的 5%)。创建 XML 的时间很慢(需要 80%)。保存它需要 15%(但我看到我可以做很多改进,所以我不担心)。 - 谢谢路易斯。

【问题讨论】:

  • 您是否进行了测量并找到了您的约束条件?数据库访问、处理或输出?如果没有测量,尝试优化其中一个或另一个是猜测
  • 对不起,我漏掉了。也会编辑帖子。数据库访问速度很快(大约占总时间的 5%)。创建 XML 的时间很慢(需要 80%)。保存它需要 15%(但我看到我可以做很多改进,所以我不担心)。
  • 我想如果您使用 SSD 而不是传统的硬盘驱动器(如果尚未使用),您可以极大地提高写入速度

标签: java xml jakarta-ee file-io xml-serialization


【解决方案1】:

我遇到了类似的问题。服务器正在使用 JDOM 在 XML 文件中写入数据。多年来,这些数据越来越大,服务器越来越慢,使用的内存也很大。原因如下:

服务器在大哈希表和列表中积累数据。在工作结束时,他在内存中使用 JDOM 创建了 XML 文档,然后将其写入磁盘。

我将 XML 写入更改为使用带有 XMLStreamWriter 的流方法 唯一的问题是,编写的 xml 文件不是很漂亮。这可以通过IndentingXMLStreamWriter

解决

代码示例如下:

FileOutputStream fileOutputStream = new FileOutputStream(outXmlFile);
XMLStreamWriter defaultWriter = factory.createXMLStreamWriter(fileOutputStream, encoding);
IndentingXMLStreamWriter writer = new IndentingXMLStreamWriter(defaultWriter);
writer.setIndentStep("  ");
try
{
    writer.writeStartDocument(encoding, "1.0");

    if (stylesheet != null)
    {
        writer.writeProcessingInstruction("xml-stylesheet", "type='text/xsl' href='" + stylesheet + "'");
        writer.writeCharacters("\n");
    }


    writer.writeStartElement(TAG_ROOT);
    writer.writeAttribute(TAG_OBJECT_TYPE, rootObject.getClass().getSimpleName());

    ...

    writer.writeEndElement();
    writer.writeEndDocument();
} 
finally
{
    writer.flush();
    writer.close();
    fileOutputStream.close();
}

【讨论】:

  • 你把自己放在非api jdk库中是错误的解决方案。
【解决方案2】:

我会考虑使用流式 XML API,例如 StAX,以避免在将整个 XML 文档写入磁盘之前将其保存在内存中。这样可以将内存占用保持在较低水平(不需要 50 倍的 XML 大小来并行处理 50 个文档)...

请参阅Why StAX? (Oracle) 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多