由于目前所在项目组的需要
小弟需要开发一个上传文件的功能
文件内部的数据量最大有10万以上在将数据保存到数据库之前需要根据某个值
在内存中进行分组操作之后,才能存储到特定的表中我不知道在内存中的这种排序性能如何
以及高效率的算法希望朋友们能多出意见
如上述描述有不全之处请多多指正

解决方案 »

  1.   

    文件的内容是按照一下格式分类的
    col_name#1000#2009-1-15#2099-1-31#res
    每次读取一行文件后再根据col_name在缓存中查询一下相应的分组字段
    之后使用下面的代码去归组Map dismantleMap = new HashMap();
    if(!dismantleMap.containsKey(regionId)){
        List list = new ArrayList();
        list.add(line);
        dismantleMap.put(regionId, list);
    }else{
        ((List) dismantleMap.get(regionId)).add(line);
    }解析使用下面的方式List batchIdList = new ArrayList();
    Map retMap = new HashMap();
    retMap = check(request, in);
    Set set = retMap.keySet();
    Iterator retIter = set.iterator();
    while(retIter.hasNext()){
      String tempRegionId = (String) retIter.next();
      long tempBatchId = createBatchOptTask(request, (ArrayList)retMap.get(tempRegionId));   //创建一个由进程去扫描处理的任务
      batchIdList.add(new Long(tempBatchId));
    }但是我感觉这种做法对于10万以上的数据量处理起来并不十分理想
    可能会导致界面死掉一段时间,对于用户的感知度不好
    不知道有没有高手能指点一些更好的做法呢?
      

  2.   

    10W行,一行行去读了再循环肯定会这样的...
    我觉的你可以把数据读出来了放进一个对象里
    然后把对象放list里...
    一次性插入数据库再去分组
      

  3.   

    放入Map后不能直接插入数据库. 这样会很慢, 就像你说的现象. 可以把map声明为static 或者用别的容器保存, 然后可以开一个线程.每隔一段定期读出保存数据的容器,然后保存在数据库中,如果有用到spring可以直接使用spring调用Quartz很方便, 当然也可以用别的方式.这样用户不会觉得很慢! 
      

  4.   

    我是上传到服务器
    但在客户端要能选择上传到服务器的地址
    给位怎么解决,用java
      

  5.   

    目前使用的方法是将文件读入到Map的同时进行分组,之后生成相应的批次任务再执行
    本机测试的结果是104400条数据开始上传到生成相应的任务所需的时间是4分30秒左右
    但是感觉还不是很理想不知道还有没有更好的方法
    而且经过测试读取文件的速度还是相当快的
    时间主要还是消耗在保存数据到数据库中
      

  6.   

    建议上传Excel文件,再解析并存入数据库