用Java创建和保存大型XML

时间:2011-11-22 08:18:49

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

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

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

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

我需要你的意见:

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

2)将它保存到文件系统的最佳和最有效的内存方式是什么? - 我正在考虑将当前的编写器更改为bufferedWriter,并在物理写入磁盘之前将其保存到内存中。 - 增加它会有任何副作用吗?

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

编辑1#数据库访问速度很快(约占总时间的5%)。 XML的创建很慢(占用80%)。节省它需要15%(但有很多改进,我看​​到我可以这样做,所以我并不担心这一点)。 - 谢谢路易斯。

2 个答案:

答案 0 :(得分:5)

我有一个类似的问题。服务器在XML文件中使用JDOM编写数据。多年来,这些数据越来越大,服务器越来越慢,内存使用量也越来越大。原因如下:

服务器在大哈希表和列表中累积数据。在作业结束时,他在内存中创建了带有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();
}

答案 1 :(得分:4)

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

有关详细信息,请参阅Why StAX? (Oracle)