【问题标题】:Best parser to parse 1 GB xml data in java [duplicate]在java中解析1 GB xml数据的最佳解析器[重复]
【发布时间】:2019-01-06 22:10:12
【问题描述】:

我的要求是: 我有 1GB xml 文件,想从 xml 文件中删除几个节点。这里删除 xml 节点可以是整个文件中基于输入的任何内容。什么是 JAVA 中最好的解析器。 我目前正在使用 DOM 解析器,它适用于 100MB 文件,但它抛出内存不足错误:1 GB 文件的堆空间。 任何人都可以在下面为我的代码建议最佳方法:

    public static void main(String[] args) {
    DocumentBuilder docBuilder = null;
    File inputFile = new File("/scratch/bigfile/final.txt");
    // Parse the xml file using DOM parser
    try{
    DocumentBuilderFactory docBuilderFactory =DocumentBuilderFactory.newInstance();
    docBuilderFactory.setExpandEntityReferences(false);
    docBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    docBuilder = docBuilderFactory.newDocumentBuilder();
       Document doc= docBuilder.parse(inputFile);

       // Remove unwanted nodes from xml file
        Element element1 = (Element) doc.getElementsByTagName("G_SUMMARY_ROWSET").item(0);
        element1.getParentNode().removeChild(element1);
        Element element2 = (Element) doc.getElementsByTagName("G_JRNLSOURCE_ROWSET").item(0);
        element2.getParentNode().removeChild(element2);
        Element element3 = (Element) doc.getElementsByTagName("G_JRNLSOURCE_UNMATCHED_ROWSET").item(0);
        element3.getParentNode().removeChild(element3);
        Element element4 = (Element) doc.getElementsByTagName("G_JRNLDETAILS_UNMATCHED_ROWSET").item(0);
        element4.getParentNode().removeChild(element4);

        // Convbert Dom Document to Byte array
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
         StreamResult result=new StreamResult(bos);
         transformer.transform(source, result);
         byte []array=bos.toByteArray();
        System.out.println(array.length);

    }
    catch (Exception e) {
             e.printStackTrace();
          }
}

【问题讨论】:

    标签: java dom xml-parsing


    【解决方案1】:

    考虑使用SAXParser。对于较大的文件,通常最好使用 SAXParser,因为数据不存储在内存中,并且在处理完大部分元素后会丢弃它们。这将解决您内存不足的问题。

    这与将整个文档加载到内存中的 DOM(文档对象模型)解析器形成对比。

    【讨论】:

    • 我忘了在这里提一点。我们使用来自服务器的输入流将 1 GB 数据存储到字节数组(不在文件中)。所以在这种情况下我们可以使用 SAX Parser 作为字节数组存储在内存中。请建议
    • @user2155454 您的问题是您无法将所有 1 GB 存储到字节数组中,因为您没有那么多内存。您的选择是不使用 SAX 解析器将其存储在内存中,或者增加堆大小。您可以使用命令java -Xmx3g your_program 增加堆大小,其中 6g 表示 3 GB。你可以根据你的机器规格做更多或更少的事情。
    • @user2155454 - 是的,你可以。您可以将 ByteArrayInputStream 交给 SaxParser,
    猜你喜欢
    • 2010-09-16
    • 2013-03-14
    • 2010-12-04
    • 2010-09-27
    • 2011-11-26
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多