会从DB里面得到两个分别100W大小List,List里面都是TxtClass对象!
然后把这个两个List中,TxtClass对象ID属性的相同的项去掉,合并成一个新的LIST,合并后大概150W左右!
然后在遍历合并的List,取出TxtClass对象,根据TxtClass对象内容创建txt文件!最后再将合并的List当做对象
传给其他方法由于100w总是溢出,而由于其他原因内存只能设置128M,
所以不知道下面的怎么修改阿
List sumList=new ArrayList(); 
for(int i=0;i<10;i++){
//执行sql,获取一个包含10W个TxtClass对象 
Sql1 = .....................100000;
          List tmpList =  10W个TxtClass对象;
          sumList.add(tmpList);
  }
 
for(int i=0;i<10;i++){
//执行sql,获取一个包含10W个TxtClass对象 
Sql2 = .....................100000;
          List tmpList =  10W个txtClass对象;
          sumList.add(tmpList);
  } 
 int sumSize = sumList.size();
 StringBuffer _sb = new StringBuffer();
 List finalList=new ArrayList(); 
 
 for(int i=0;i<sumSize;i++){
  List tmpList = (List)sumList.get(i);
  int tmpSize = tmpList.size();
  List finaTmplList=new ArrayList();
  for(int j=0;j<sumSize;j++){
  TxtClass tmpTxtClass = (TxtClass)tmpList.get(i);
  String strId = tmpTxtClass.getId();
  _sb.append(strId+",");
  if(_sb.toString().indexOf(strId+",")<0){
  //如果该ID从来没有存在过则用tmpTxtClass对象内容生成文件
  writeFile(tmpTxtClass);
  finaTmplList.add(tmpTxtClass);
  }
  }
  finalList.add(finaTmplList);
  //最后再将合并的List当做对象传给其他方法
  xxxClass.xxxMethod(finalList);
 
 }

解决方案 »

  1.   

    为什么不先通过d b去掉重复的呢?要知道数据库的算法一般都是优化过的,而且db 和web不在一起的话,占用的web的内存更少的
      

  2.   

    由于100w总是溢出,而由于其他原因内存只能设置128M合并后大概150W左右!最后再将合并的List当做对象传给其他方法你这样的思路本来就进行不下去,就算前面处理好了,后面也不能合并成功
      

  3.   

    我觉得你可以考虑不用list,直接在数据库操作如果你要写入文件,直接在数据库合并后写入文件
    要传给其他方法,把数据库条件传给其他方法,或者把数据库结果给其他方法以上只是提示,具体问题具体分析
      

  4.   

    给你个思路。
    1.先用sql语句得出唯一ID的List
        数据库中不是有Distinct嘛,别在程序中做这个事情。效率慢很多。
        List<String> list = SQL 执行结果。就是ID的list2. 循环这个list,取出的每个Id都去查数据库。然后取出里面的TxtClass对象内容写入到文件中。这样做虽然访问数据库的操作多了,但是应该不会出现内存不够的问题了。
      

  5.   

    是否可以换个思路,比如数据合并在database中进行
      

  6.   

    以上说得对呀 干嘛非得在WEB里面做啊 你直接在DB里面做啊 写存储过程不是更好建议你换一种思路
      

  7.   

    1. 如果数据来自多个表,可以使用连接查询或union得到一个结果集,如果想去掉重复记录使用distinct,要充分利用数据库的计算资源来完成数据的检索和筛选。
    2. 经1处理后如果数据量仍然巨大,可以结合分页方法,将查询结果分若干页一页一页获取再分批处理。否则可能影响数据库服务器性能,并导致堆栈溢出。
    3. 写文件时可以考虑使用线程池来避免线程频繁创建销毁带来的额外开销,但不要将工作线程配置的太多,否则性能不升反降。多次测试一下,找到一个平衡点。
    4. 将JVM的最大可用内存设大点,方法 java -Xmx512m ...,如果是Web应用,则设置相应Web服务器的配置即可。