2015-10-17 3 views
-1

Это цикл в моем коде, который я пытаюсь оптимизировать. Он принимает 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(); 

Этот бит кода получает подстроки я уже упоминал выше, из файла и сортов в каждый файл Шара (0) .txt

это занимает около 70000ms заботиться о файле 500кб

но когда файл становится достаточно большим, как 500mb, время становится настолько большим

поэтому мои вопросы

  • Есть ли лучший способ получить подстроки, как я хочу в файл?
  • Или есть способ ускорить работу BufferedReader?
+0

Я думаю, что будет лучше сделать 'String [] list = s.toLowerCase(). ReplaceAll (" [^ az] "," ") .split (" ")' вместо этого для каждой строки 'String 'в массиве. – Titus

+0

Кроме того, вы не закрываете «BufferedWriter» после того, как закончите с ним. – Titus

+0

oh извините за это. после кода происходит закрытие(). Я отредактирую его – MeromGreen

ответ

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(); 
    } 

Edit Испытано с http://textfiles.com/programming/bourne1.txt, который является 597768 байт текстовый файл. Заканчивается через 1 (одну) секунду.

+0

Ничего себе. Я никогда не ожидал, что это будет так быстро. У меня есть дополнительный вопрос. Есть ли способ быстро открыть файлы? как буферизованный писатель? Может быть, не нужно, так как существует только String и (Int) String? – MeromGreen

+0

Открытие файла обычно состоит из выделения буфера и вызова операционной системы. Вы не можете оказывать большого влияния на тех или иных. Но старайтесь избегать повторных операций открытия/закрытия, так как ОС должна выполнять определенную работу, включая фактический ввод-вывод на устройстве для чтения и записи блоков в файле данных или данных файловой системы - даже если есть кеш, это означает, что данные перемещения назад и вперед. – laune

Смежные вопросы