日期:2014-05-20  浏览次数:20669 次

关于千万笔String处理效能
al9是一个ArrayList但存有一千多万笔String数据所进行如下过滤工作会跑特久
怎么修改以下过滤工作可以加快处理(任何可以加快的方法都可以)
Java code

String filter="";
         Iterator<String> it = al9.iterator();
              Iterator itt = al9.iterator();
                    while(itt.hasNext()){
                        String bom = (String)itt.next();
                        String[] boma = bom.split("\\$");
                        if(filter.equals("")){
                          Iterator it2 = al9.iterator();
                          while(it2.hasNext()){
                              String bom2 = (String)it2.next();
                              String[] bom2a = bom2.split("\\$");
                              if((bom2a[2].equals(boma[2])) && (bom2a[1].equals(boma[1])) && (bom2a[3].equals(boma[3]))){
                                  bomal2.add(bom2);
                                  
                              }
                              //i01++;
                          }
                          filter=filter+boma[0]+"$"+boma[2]+"$"+boma[3]+";";
                        }else if(filter.contains(boma[2]+"$"+boma[3]+";")){
                            
                        }else{
                            Iterator it2 = al9.iterator();
                          while(it2.hasNext()){
                              String bom2 = (String)it2.next();
                              String[] bom2a = bom2.split("\\$");
                              if((bom2a[2].equals(boma[2])) && (bom2a[1].equals(boma[1])) && (bom2a[3].equals(boma[3]))){
                                  bomal2.add(bom2);
                                  
                              }
                              //i02++;
                          }
                          filter=filter+boma[2]+"$"+boma[3]+";";
                        }
                          
                    }



------解决方案--------------------
千万级记录数,任何方法都会跑挺久,跟Spring没啥特定关系吧。。。

考虑代码改为分布式计算,用N个线程甚至直接来N台电脑,每个负责执行1/N的数据处理任务。

具体可以参考Map/Reduce的实现。
------解决方案--------------------
数据量大了,用什么方法都会显得比较慢。
------解决方案--------------------
楼主算法可优化的空间很大,
数据量是一方面,楼主算法缺陷,是最大的瓶颈。
下午,我抽时间,仔细看看楼主算法。
------解决方案--------------------
建议
①是否可以用数据库端做这些事情
②如果在数据进入的时候,规范字符串格式,则只需要直接比较bom和boma两个字符串是否相等即可,无需split后逐一比较分量了
③是否可以在hashCode上下点功夫,提高算法速度
------解决方案--------------------
给做个格式化,还加了al9, bomal2两个list
Java code

        ArrayList<String> al9 = new ArrayList<String>();
        ArrayList<String> bomal2 = new ArrayList<String>();
        String filter = "";
        Iterator<String> it = al9.iterator();
        Iterator itt = al9.iterator();
        while (itt.hasNext())
        {
            String bom = (String) itt.next();
            String[] boma = bom.split("\\$");
            if (filter.equals(""))
            {
                Iterator it2 = al9.iterator();
                while (it2.hasNext())
                {
                    String bom2 = (String) it2.next();
                    String[] bom2a = bom2.split("\\$");
                    if ((bom2a[2].equals(boma[2])) && (bom2a[1].equals(boma[1])) && (bom2a[3].equals(boma[3])))
                    {
                        bomal2.add(bom2);

                    }
                    // i01++;
                }
                filter = filter + boma[0] + "$" + boma[2] + "$" + boma[3] + ";";
            }
            else if (filter.contains(boma[2] + "$" + boma[3] + ";"))
            {

            }
            else
            {
                Iterator it2 = al9.iterator();
                while (it2.hasNext())
                {
                    String bom2 = (String) it2.next();
                    String[] bom2a = bom2.split("\\$");
                    if ((bom2a[2].equals(boma[2])) && (bom2a[1].equals(boma[1])) && (bom2a[3].equals(boma[3])))
                    {
                        bomal2.add(bom2);

                    }
                    // i02++;
                }
                filter = filter + boma[2] + "$" + boma[3] + ";";
            }
        }