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] + ";"; } }