我现在遇到一个问题:  
为了节约数据的计算时间,我需要先把数据库中的数据都取出来,放在内存中。
再计算这些数据。
计算一天的数据,list的程度大概越有14000条,HashMap大概也是14000条数据。
如果计算一个月的数据,理论上list和HashMap的长度都会达到14000*30=420000条
但计算的时候,过很长时间后总会提示一个错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
这个意思应该是虚拟机的内存满了吧
所以我猜是不是这个list和HashMap的长度太长了对于这个问题  应该怎么解决?

解决方案 »

  1.   

    为什么不在数据库算?
    如果一定要在内存算的话,运行参数里加大jvm内存好了。
      

  2.   

    呵呵  计算一个平均的指标值 
    比如
    A中包括 : a,b,c,d,e.....
    a中每天都会生成288个值(b,c,d....都会每天新生成288个值)计算逻辑:要把a中的这一天的第一个值,加上b中这一天的第一个值,加上c中。(A中所包含的所有元素的这一天的第一个值相加)    除以   A的长度    得出一个值来 为rest1再把a,b,c,d...中这一天的第二个值按上面的过程计算,得出rest2

    这样吧A中所有的元素计算后,把rest1,rest2,rest3.排序返回最大的25个
      

  3.   

    理论上来说 list和hashmap数据条是可以无限放的。。只要你的JVM的内存够。
    还有一点,你可以直接用数据库来排序然后插入的。(简单的计算好像都可以)
    oracle里面的 hs/sql(好像是这个名字,可能有差错) 可以完成这个人物。。其他数据库按照顺序取出来肯定是可以的。(计算后数据)
      

  4.   

    靠jvm的内存访问能力有些不安全。处理大数据,最好在数据库中完成,
    比如建立一些view什么的进行一些预处理,
    或者写存储过程,通过java调用来解决。否则测试的时候OK,真正运行起来的话,
    很多陷阱就会出现了good luck
      

  5.   


    运行机器的内存有多大?虚拟机默认内存修改没?就是运行时-XmxXXXm设了没?关于过大的内存内存丢失问题,JVM是不保证的,但是2,3个G内不会有什么问题,更大的话,考虑采用内存数据库产品吧?但是这么大的数据量考虑的不是速度问题而是可靠性问题了。
      

  6.   

    不是容器的长度问题,是虚拟机分配的内存不足。如果需要大量数据存储在内存中,建议使用带容量参数的构造方法,如ArrayList<E> al=new ArrayList<E>(420000); 因为数据插入时候超过当前最大长度时容器会构造新的数组出来拷贝原有内容,降低执行效率,具体原因可以参考相关容器类的源代码。
      

  7.   

    还是应该在数据库中计算
    使用sql就可以计算出这25个值来,然后再把每天的25个值存到数据库中,这样效率就提高了
      

  8.   

    以前我也碰到过这个问题。我是对一年的历史电厂数据进行数据分析,开始的时候一天一天的进行数据,将分析的数据写到数据库中,后来觉得太慢,而且看了一些文章说,把先把数据放在内存中,再进行分析速度会快很多。就像你一样,把一个月的数据全部进行封装,放在arraylist里面,然后进行数据分析。结果程序好长时间都没反应,一条数据也没有分析出来。原来10分钟出来一条分析数据,修改后好几个小时也没有一条分析数据出来。也没有报任何错误。
    没办法,后来又改成一天一天进行数据分析了。    
      

  9.   

    考虑一下存储过程,在存储过程里面把这件事情给做了。我们对大数据量的业务数据做统计的时候都是在数据库后台开一个job自动执行存储过程来搞定的。
      

  10.   

    个人觉得  不能扩大jvm内存   这样等于回避问题   我不可能把项目拿到用户那边去了  每台机器都改jvm内存的
    这个还得从逻辑或技术上解决  
    我现在还是像17楼的哥们说的那样   按天来统计的