由于做实验遇到处理大量数据,这时将数据不断加入hashtable中,会出现内存溢出问题。请问该如何解决,有没有什么好的方法?

解决方案 »

  1.   

    我也碰到类似的问题,  在 oracle 中提取出来的数据太多了。  无法存到 Vector 中
    严重关注!!!!
      

  2.   

    java -Xmx (应该是这个参数把)设置最大stack 内存你打java -X 看看其他参数
      

  3.   

    什么试验?用得着全放内存里?变态的需求!!!
    如楼上所说;
    java -Xmx
     
      

  4.   

    lz &  huantianxidi(欢天喜地) :你写一个死循环,不断往hashtable/list之类的容器中添加数据,也会outofmemory!你们需要考虑,如何不让它出现这样的情况,比如,分页处理是不是不该一下子把所有数据都取出来?
      

  5.   

    呵呵,在语言层面,java在vector中采用int处理元素下标,也就是,再怎么大,也只能存放存放2g个元素(int型用掉了一位来表示负数)。hashtable估计也是这样吧(现在用的机器上没有java看不了原码)。
    而在虚拟机层面,在windows平台下,进程的空间一共是 4g, 系统用掉了2g,还剩下2g给jvm用
    ,对于服务器可以加一个什么参数把用户进程空间调到3g,但是再怎么调也是有限的。(jvm本身也要调整才能用那么大的空间),unix和linux平台下就不太清楚了。关于你的问题,基于这两个原因,如果估算你用到的数据量太大,超出这些空间,那么就需要采用变通方法。毕竟操作系统提出虚拟内存这个变革性的概念,并不是承诺给程序员无限的空间。
    你可以借鉴操作系统的交换分区的做法。自己封装一个hashtable类,根据一定的策略把那些不用的数据置换到外存,需要用到的时候再换回来,没办法,只能用时间来换取时间了。嘿嘿,还有一个方法,就是等64位操作系统出来。
      

  6.   

    你的问题目标不明确。
    如果你想不改变算法,而容纳下现有的数据,那么如前面所说,java -Xmx,前提是你有足够多的内存。
    如果你想通过改变算法解决这个问题,那么你得描述你弄这么多数据到内存干什么,数据量到底多大。用ORM对JDBC做封装就可能出现这个问题,因为本来直接使用resultset,无论结果集有多大都不会有内存问题,因为resultset每次只预取一部分数据,而ORMapping可能涉及到把一个结果集的所有记录全部转换成OBJECT,那么就会出现你说得这个问题,一般如果是在WEB上应用,比较好的方法还是采用分页,减少数据量。看看你是什么问题。
      

  7.   

    谢谢
    sjjf(水晶剑锋)    jinxfei(周华健、言兴朋、茅威涛) 那我先说我的了。 
        我不是用来分页用的, 我把oracle的数据提取出来,生成html静态页面用的。
      

  8.   

    楼主表达一下你的应用场景吧;毕竟分页(批次提取) 或者  你加入HashTable的对象的设计 等都可能衍生出许多问题
      

  9.   

    zealVampire(白鹤泉)
    java -Xmx (应该是这个参数把)设置最大stack 内存
    开大JVM的内存或者用SQL来先分页,然后循环将分页的数据送入HashMap中,每次循环头要new HashMap()一次。
    也可以用ArrayList()来试试,它默认可以存4.5M的数据,应该是对象中最大的。
      

  10.   

    生成静态页面为什么一定要放到hashtable里,说说你的算法吧。
      

  11.   

    呵呵,不同的应用目的不一样和数据结构和处理过程的不一样导致采用的方法也不一样。
    比如,如果你注重用户的对 系统的响应时间的 体验,那么取一点数据就将其显示出来的做法就较优,(比如所谓的分页机制)
    但是,如果要处理的是从一大堆基础数据里面中取数据统计。那就等处理完所有的数据才能给用户结果,而且显示统计结果极少,那么所谓的分页倒没有什么用处。不会明显的提高系统响应时间。我不明白你为什么要生成html,因为如前面所言 sence不够明确。
    但是比较正确的处理这类问题的方法是建立数学模型,把你环境涉及因素放入这个模型内。
    然后根据客户需要或者某些需要建立目标评价函数。也许说的太过于抽象,而且其中还有很多求解分析的技巧,但是在这种信息程度只能这样泛泛而论了。实际的模型里,每一步里都应该有量化数据,才能够推算出好的设计结构和算法处理过程。数学是个有用东西,同时也是一个不是三言两语就能说明白的东西。
      

  12.   

    如果仅仅要生成HTML 还是分页的好.
      

  13.   

    你可以边读别写入一个xml文档
    然后用xsl和xml相接合的方式,产生一个html页面.
    并不一定非要全部读入内存才能处理并且jvm的内存使用是有最大限制的,并且jvm作为一个进程,在window系统中最大只能有2G的内存使用(通过设置,可以达到更多,但好像不会超过3G吧),所以,把数据都写到内存,不是个好办法