当前位置: 代码迷 >> J2SE >> 关于千万笔String处理效能,该怎么解决
  详细解决方案

关于千万笔String处理效能,该怎么解决

热度:147   发布时间:2016-04-24 01:54:06.0
关于千万笔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] + ";";            }        }
  相关解决方案