用于生成子字符串的循环优化
Loop optimization for generating sub-strings
这是我要优化的代码中的循环。它以 arg[0] 作为文件名并生成子字符串但不是所有子字符串,例如,mice as mice、ice、ce、e。这就是 getAllUniqueSubset()
所做的。
BufferedReader in = new BufferedReader(new FileReader(args[0]));
new File("./indexof"+args[0]).mkdirs();
BufferedWriter out = null;
SubString sub = new SubString();
String s;
while ((s = in.readLine()) != null) {
String[] list = s.split(" ");
for(int i=0;i<list.length;i++){
ArrayList<String> substrings = sub.getAllUniqueSubset(list[i].replaceAll("[^a-zA-Z]", "").toLowerCase());
for(String sb:substrings){
out = new BufferedWriter(new FileWriter("./indexof"+args[0].toLowerCase()+"/"+sb.charAt(0)+".txt",true));
out.write(sb);
out.write(" ");
out.write(Integer.toString(lineNumber));
out.newLine();
out.flush();
}
}
lineNumber++;
}
in.close();
out.close();
这段代码从文件中获取我上面提到的子字符串,并将其排序到 charAt(0).txt
的每个文件中
处理一个 500kb 的文件大约需要 70000 毫秒
但是当文件大到 500mb 时,时间就会变得很大
所以我的问题是
- 有没有更好的方法来获取我想要的子字符串到文件中?
- 或者有没有办法加快 BufferedReader 的速度?
这使 BufferedWriters 保持打开状态。删除冲洗。添加了更大的缓冲区大小。 - 对一行的处理效率更高一些
BufferedReader in = new BufferedReader(new FileReader(args[0]));
new File("./indexof"+args[0]).mkdirs();
BufferedWriter[] outs = new BufferedWriter[26];
SubString sub = new SubString();
String s;
int lineNumber = 1;
while( (s = in.readLine()) != null ){
s = s.replaceAll("[^\sa-zA-Z]", "").toLowerCase();
String[] list = s.split("\s+");
for( String sl: list ){
ArrayList<String> substrings = sub.getAllUniqueSubset(sl);
for( String sb: substrings ){
BufferedWriter out = outs[sb.charAt(0)-'a'];
if( out == null ){
out = outs[sb.charAt(0)-'a'] =
new BufferedWriter(new FileWriter("./indexof"+args[0]+"/"+sb.charAt(0)+".txt",true), 1024*16);
}
out.write(sb);
out.write(" ");
out.write(Integer.toString(lineNumber));
out.newLine();
}
}
lineNumber++;
}
in.close();
for( BufferedWriter out: outs ){
if( out != null ) out.close();
}
编辑 使用 http://textfiles.com/programming/bourne1.txt 测试,这是一个
597768 字节文本文件。在 1(一)秒内完成。
这是我要优化的代码中的循环。它以 arg[0] 作为文件名并生成子字符串但不是所有子字符串,例如,mice as mice、ice、ce、e。这就是 getAllUniqueSubset()
所做的。
BufferedReader in = new BufferedReader(new FileReader(args[0]));
new File("./indexof"+args[0]).mkdirs();
BufferedWriter out = null;
SubString sub = new SubString();
String s;
while ((s = in.readLine()) != null) {
String[] list = s.split(" ");
for(int i=0;i<list.length;i++){
ArrayList<String> substrings = sub.getAllUniqueSubset(list[i].replaceAll("[^a-zA-Z]", "").toLowerCase());
for(String sb:substrings){
out = new BufferedWriter(new FileWriter("./indexof"+args[0].toLowerCase()+"/"+sb.charAt(0)+".txt",true));
out.write(sb);
out.write(" ");
out.write(Integer.toString(lineNumber));
out.newLine();
out.flush();
}
}
lineNumber++;
}
in.close();
out.close();
这段代码从文件中获取我上面提到的子字符串,并将其排序到 charAt(0).txt
的每个文件中处理一个 500kb 的文件大约需要 70000 毫秒
但是当文件大到 500mb 时,时间就会变得很大
所以我的问题是
- 有没有更好的方法来获取我想要的子字符串到文件中?
- 或者有没有办法加快 BufferedReader 的速度?
这使 BufferedWriters 保持打开状态。删除冲洗。添加了更大的缓冲区大小。 - 对一行的处理效率更高一些
BufferedReader in = new BufferedReader(new FileReader(args[0]));
new File("./indexof"+args[0]).mkdirs();
BufferedWriter[] outs = new BufferedWriter[26];
SubString sub = new SubString();
String s;
int lineNumber = 1;
while( (s = in.readLine()) != null ){
s = s.replaceAll("[^\sa-zA-Z]", "").toLowerCase();
String[] list = s.split("\s+");
for( String sl: list ){
ArrayList<String> substrings = sub.getAllUniqueSubset(sl);
for( String sb: substrings ){
BufferedWriter out = outs[sb.charAt(0)-'a'];
if( out == null ){
out = outs[sb.charAt(0)-'a'] =
new BufferedWriter(new FileWriter("./indexof"+args[0]+"/"+sb.charAt(0)+".txt",true), 1024*16);
}
out.write(sb);
out.write(" ");
out.write(Integer.toString(lineNumber));
out.newLine();
}
}
lineNumber++;
}
in.close();
for( BufferedWriter out: outs ){
if( out != null ) out.close();
}
编辑 使用 http://textfiles.com/programming/bourne1.txt 测试,这是一个 597768 字节文本文件。在 1(一)秒内完成。