2014-01-19 5 views
0

У меня есть локально сохраненный файл размером около 2,3 МБ, всего около 500 000 строк, и я хотел бы сохранить его в памяти HashSet. Поскольку файл большой, и чтение происходит так медленно, я разделил файл на 5 меньших, менее 100 000 строк.
Моя идея состоит в том, чтобы создать 5 отдельных потоков из класса Application. Каждый поток будет читать свой собственный файл и хранить данные в своем собственном наборе. По завершении он вернет полученное подмножество в основной поток, т. Е. к классу Application, который затем будет храниться в основном наборе. код резьбы выглядит следующим образом:Загрузите огромный файл в память

private class LoadFileThread extends Thread { 
    private String filename; 
    private Set<String> subSet; 
    private MyApplication application; 

    public LoadFileThread(String filename, MyApplication ctx) { 
     this.filename = filename; 
     this.application = ctx; 
     this.subSet = new HashSet<String>(); 
    } 

    @Override 
    public void run() { 
     AssetManager am = application.getAssets(); 
     BufferedReader reader = null; 
     try { 
      InputStream is = am.open(filename); 
      reader = new BufferedReader(new InputStreamReader(
       is)); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       subSet.add(line.toUpperCase()); 
      }   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try {reader.close();}catch (IOException ignorable) {} 
     } 
     application.setSubSet(subSet, this.getName()); 
    } 

} 

Метод setSubSet в классе Application:

public synchronized void setSubSet(Set<String> subSet, String name) { 
     myMainSet.addAll(subSet); 
     Log.d("Thread finished", name); 
    } 

Две проблемы возникают:

  1. Чтение по-прежнему waaaaay замедляться.
  2. Я получаю ошибку из памяти при вызове addAll на основном наборе.

Есть ли лучший способ сделать это? Как?

+0

Может ли ваш диск читать из 5 разных мест одновременно? –

+0

У вас есть эти цифры правильно? 2.3Mb с 500 000 строк делает каждую строку длиной около 5 символов. –

+0

Кроме того, 2.3Mb можно прочитать за долю секунды. –

ответ

1

С 500 000 строк и readLine() вы делаете 500 000 просмотров.

Создайте буфер 64 КБ и прочитайте его.

Обработать каждую полную строку, после чего вы можете прочитать еще 64k.

Это должно сократить ваши чтения до доли в 500 000

+0

Почему 64k, а не какой-то другой номер? –

+0

Я думал, что в своем чтении я читал, что tgat Android использует 64k ​​под капотом, чтобы соответствовать этому. Возможно, 32k было лучше: http://stackoverflow.com/questions/10143731/android-optimal-buffer-size – MikeHelland

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