DOM 就是将整个文件保存在内存中,如果数据量比较大
应该使用SAX

解决方案 »

  1.   

    我要在内存中创建一个非常大的dom对象,然后把它保存到文件中,可是在生成dom对象的一个大元素时,报告内存溢出,而实际内存剩余超过1G,而且查询的行数最大时只有1000万,到底为什么?
      

  2.   

    sax能保存文件吗?分多次好像不太适合我现在的情况。而且内存是足够大的,是不是java虚拟机不能管理太大的内存?担心中。
      

  3.   

    看看在你转换的过程中是否用到了Vector之类的对象
      

  4.   

    哪位知道OutOfMemoryError这个错误何时会出现,出现的理由是什么?
      

  5.   

    SAX 可以一边解析,一边保存
      

  6.   

    如何保存,请详细说明!Thank You!!!!!
      

  7.   

    你存放到数据库里的是什么?整个XML文件?
      

  8.   

    我是从数据库中读取大量的数据,生成一个DOM对象,对一些属性设置后,保存成XML文档,小数据量时没有问题,数据量达到了1000万,才生成不到100000就报内存溢出的错误。
    实在不明白。
    请指教。
      

  9.   

    我觉得是 生成dom对象是内存溢出,我以前对一个32M的xml检索
    检索方式 10000万条数据符合的条件10条       100000万条数据符合的条件100条      
    Sax 检索  1078毫秒(cpu 97%,内存 :基本不变) 10265毫秒 (cpu 100%,内存 :基本不变)
    Dom检索  5297毫秒(cpu 100%,内存 :基本不变) java.lang.OutOfMemoryError
    我在dom检索是也是先生成一个dom对象的
    当然我的机器是256m PIV 1.7G,要不把source贴出来 让大家看看有没有可以优化de
    你也可以把内存打印出来看看 Runtime.getRuntime().totalMemory()
      

  10.   

    /**
       * 填充元素EntitlementQueryReport<br/>
       * 这里不用了解具体数据库结构,用指定的SQL,按顺序传进指定参数得到结果集<br/>
       *
       * @param report
       */
      public void WriteReportElement(Element report)
      {
        Element child = null;
        Open(); //打开数据库
        try
        {
          this.pst = cn.prepareStatement(SmsService.sysPara.getQuerySQL().
                                         getEntitlementSQL());
          pst.setQueryTimeout(0);
          pst.setString(1, this.getStartDateTime().toString());
          pst.setString(2, this.getEndDateTime().toString());
          ResultSet rs = pst.executeQuery();
          int j = 0;
          String tmp = null;
          ResultSetMetaData rsmd = rs.getMetaData();
          while(rs.next())
          { //将rs的全部字段的值作为属性插入到与元素中
            try
            {
              child = doc.createElement("ICCard");
              System.out.println(j++);
              for(int i = 1; i <= rsmd.getColumnCount(); i++)
              {            try
                {
                  try
                  {
                    tmp = rs.getObject(i).toString();
                  }
                  catch(OutOfMemoryError e)
                  {e.printStackTrace(System.out);
                    System.out.println(e.getMessage());
                  }
                  //将ICCardID和CASID从十进制数值转换成16进制字符串
                  tmp = ValueFilter(rsmd.getColumnName(i), tmp);
                }
                catch(NullPointerException e)
                { //保证不会将NULL值付给元素的属性
                  tmp = "";
                }
                child.setAttribute(rsmd.getColumnName(i), tmp);
              }
            }
            catch(OutOfMemoryError e)
            {
              e.printStackTrace(System.out);
              System.out.println(e.getMessage());
            }
            report.appendChild(child);      }
        }
        catch(SQLException e)
        {
          Debug.Println("生成EntitlementReport发生数据库异常");
          Debug.PrintErr(e);
        }
        catch(OutOfMemoryError e)
        {
          e.printStackTrace();
          System.out.println(e.getMessage());
          //System.out.println(e.getStackTrace().toString() );
        }
        finally
        {
          Close(); //关闭数据库
        }
      }
      

  11.   

    先看看你的e.printStackTrace();打出来的exception 的内存溢出看看在那个方法 里
    要不
    把这2个方法注释依次调试看看
    tmp = ValueFilter(rsmd.getColumnName(i), tmp);report.appendChild(child);
      

  12.   

    e.printStackTrace()打印出来是OutOfMemoryError就在WriteReportElement方法中
      

  13.   

    注释tmp = ValueFilter(rsmd.getColumnName(i), tmp);后只是延缓了报错的时间
      

  14.   

    我写Excel文件,超过10000多条记录时,也出现这种问题,正不知如何解决