猪猪123
2012-03-27 15:24
浏览 551

java解析xml文件多个线程同时访问时内存溢出

     java解析xml文件多个线程同时访问时内存溢出,代码如下:

解析的xml文件大小大概2M-10M,该怎么解决呢?

 

String sourceFile = ConfigReader.get("data.store.path") + article.getSourceFile();
        
        org.dom4j.Document document = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream(new File(sourceFile));
            document = new SAXReader().read(fin);
        } catch (final FileNotFoundException e) {
            final String msg = "内容单元xml文件不存在:" + sourceFile;
            log.error(msg, e);
            throw new RuntimeException(msg, e);
        } catch (final DocumentException e) {
            final String msg = "解析内容单元xml文件失败:" + sourceFile;
            log.error(msg, e);
            throw new RuntimeException(msg, e);
        } finally {
            IOUtils.closeQuietly(fin);
        }
        
        final StringBuilder xpath = new StringBuilder("/KFMP/DOCS/DOC[@GUID='")
            .append(article.getGuid()).append("']/").append("CONTENT");

        final Node node = document.selectSingleNode(xpath.toString());
        final String value = node.getText();
        article.setContent(value);
        
        final StringBuilder coordXpath = new StringBuilder("/KFMP/DOCS/DOC[@GUID='")
        .append(article.getGuid()).append("']/").append("COORDS");
        final Node coordsNode = document.selectSingleNode(coordXpath.toString());
        final String coordsValue = coordsNode.getText();
        article.setCoords(coordsValue);
        
        final StringBuilder briefXpath = new StringBuilder("/KFMP/DOCS/DOC[@GUID='")
        .append(article.getGuid()).append("']/").append("BRIEF");
        final Node briefNode = document.selectSingleNode(briefXpath.toString());
        final String briefValue = briefNode.getText();
        article.setBrief(briefValue);
        
        return article;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • Tree_2002 2012-03-28 15:53
    已采纳

    建议使用sax解析 ,dom解析会将所有的数据读入内存 。

    或者进行增加硬件设施,或优化JVM等操作。

    点赞 评论
  • Aronlulu 2012-03-27 16:11

    如果是多个线程访问多个xml的话,那只能限制线程数量。
    如果是多个线程访问一个xml的话,那就第一个线程解析完后就缓存。后续多线程只读缓存。

    点赞 评论
  • weixin_42498755 2012-03-27 16:31

    SAX方式解析xml也会内存溢出? 应该不会吧!

    点赞 评论
  • ll89308839 2012-03-27 19:36

    加大XMX,32位的最大只能用1.5G

    点赞 评论
  • mavlarn 2012-03-27 20:57

    每次一个document初始化好以后,放到一个map里,文件名作为key,用的时候,先看看map里面有没有,没有再初始化一个document,这样保证每一个xml文件只生成一个document对象。

    如果这样都会溢出,那就是你的xml文件太大了,设计不合理,试着拆成多个小文件。

    点赞 评论
  • 大象学跳舞 2012-03-27 21:30

    如果是文件太大就拆分成多个xml文件然后在分别解析

    点赞 评论
  • ll89308839 2012-03-28 07:52

    那就创建两个org.dom4j.Document
    一个用来读数据,一个用来操作数据
    想办法保证两个数据的同步

    点赞 评论

相关推荐 更多相似问题