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

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 时,时间就会变得很大

所以我的问题是

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