Я пишу приложение для Android, которое требует от меня обработки очень большого файла (скажем, 50 МБ). Файл содержит три записи: идентификатор пользователя, artistid и количество раз, которое пользователь прослушал этого исполнителя. Поэтому сейчас я пишу код, чтобы выяснить, кто самый популярный исполнитель, исходя из того, сколько раз его слышали. Я достигаю этого путем хэширования каждого идентификатора исполнителя (ключ), а затем числа раз, когда он был услышан (значение).
Код работает нормально до тех пор, пока размер файла не превышает 20 Б (я запускаю приложение на Nexus S 4g, поэтому размер кучи составляет 32 МБ), но я получаю сообщение об ошибке «Недостаточно памяти» для больших файлов. Я понимаю, что код очень плохо написан. Любые предложения о том, как я мог справиться с этой проблемой!
while ((text = inRd.readLine()) != null) {
StringTokenizer st = new StringTokenizer(text);
while (st.hasMoreTokens()) {
int userid = Integer.parseInt(st.nextToken());
artistid = Integer.parseInt(st.nextToken());
int no_times = Integer.parseInt(st.nextToken());
if (hm.containsKey(artistid)) {
Integer oldval = (Integer) hm.get(artistid);
Integer newval = no_times + oldval;
hm.remove(artistid);
hm.put(artistid, newval);
} else
hm.put(artistid, no_times);
}
}