У меня есть локально сохраненный файл размером около 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);
}
Две проблемы возникают:
- Чтение по-прежнему waaaaay замедляться.
- Я получаю ошибку из памяти при вызове
addAll
на основном наборе.
Есть ли лучший способ сделать это? Как?
Может ли ваш диск читать из 5 разных мест одновременно? –
У вас есть эти цифры правильно? 2.3Mb с 500 000 строк делает каждую строку длиной около 5 символов. –
Кроме того, 2.3Mb можно прочитать за долю секунды. –