用于生成子字符串的循环优化

时间:2015-10-17 16:01:18

标签: java file for-loop bufferedreader bufferedwriter

这是我想要优化的代码中的循环。它将arg [0]作为文件名并生成子串但不是所有子串,例如,鼠标为小鼠,冰,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

这需要大约70000毫秒来处理500kb文件

但是当文件变得足够大,如500mb时,时间会变得很大

所以我的问题是

  • 有没有更好的方法来获取我想要的文件中的子串?
  • 或者有没有办法加速BufferedReader?

1 个答案:

答案 0 :(得分:0)

这使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(一)秒。