Чрезвычайно медленная работа при загрузке ArrayList размером 1 440 000 с Android
Исходный код как показано ниже
public static ArrayList<Integer> readFile(String fileName) {
String sdPath;
sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
ArrayList<Integer> data = new ArrayList<Integer>();
try {
Scanner s = new Scanner(new FileInputStream(new File(sdPath + fileName)));
while( s.hasNext() ) {
data.add( s.nextInt() );
}
}
catch(FileNotFoundException fN) {
fN.printStackTrace();
}
catch(IOException e) {
System.out.println(e);
}
return data;
}
Когда я запускаю этот код, LogCat показывает ниже сообщение с любым изменением дисплея в моем Android
.
.
.
04-27 00:12:31.216: D/dalvikvm(17141): GC_CONCURRENT freed 1953K, 23% free 15699K/20295K, paused 2ms+12ms
.
.
.
Кроме того, приведенный выше код полностью работает на моем рабочем столе в течение нескольких секунд.
Пожалуйста, помогите мне.
2 ответа
Телефоны имеют очень ограниченные ресурсы по сравнению с настольными компьютерами. Вы не должны ожидать, что телефон сможет выполнять вычислительно сложную задачу с той же скоростью, что и настольный компьютер...
Вы используете всю оперативную память телефона, пытаясь загрузить в нее такой большой массив ArrayList.
несколько советов:
- Переместите ваш код readFile в фоновый поток, если его там еще нет.
- Рассмотрим другую структуру данных, какой-то SQL мог бы обрабатывать этот большой набор данных более эффективно
- Попробуйте загружать только (относительно) небольшую часть ArrayList за раз. работайте с нужным разделом, а когда вам нужен другой раздел, загрузите его отдельно.
- Попробуйте разбить данные на несколько небольших файлов и загрузить только тот, который вам нужен для текущей операции.
Просто храните данные на диске и используйте вместо этого отображенный в памяти ввод-вывод. Взгляните на FileChannel и функцию map и возьмите его оттуда. Буферные классы также имеют методы для получения целых чисел.