Загрузка большого массива шорт в Android

1

Предположим, у меня есть массив коротких длин длиной 1 000 000, и мне нужно, чтобы это было создано или загружено в ОЗУ (в идеале в течение нескольких секунд), когда мое приложение запускается и до того, как я получу тайм-аут потока активности.

У меня будет быстрый доступ к его записям во время выполнения.

  • Как вы собираетесь загружать это в память из файла? Загрузка из txt файла? Из файла SQLite (с двумя целыми столбцами в одной таблице, один для индекса, а другой для значения)?

  • Возможно ли, чтобы действие запрашивало более длительное время простоя до того, как оно было рассчитано на время?

  • 0
    Если вы просто хотите загрузить данные в линейном порядке, я думаю, что самым быстрым способом был бы файл двоичных данных.
  • 0
    @ Сэм: Это возможно, если я заглушу несколько фиктивных (нулевых) записей. Расположение записи в массиве важно, и мне не нужны все индексы массива - полезна только около четверти, распределенная неравномерно.
Показать ещё 1 комментарий
Теги:
arrays

1 ответ

3
Лучший ответ

Решение вашей проблемы будет состоять в том, чтобы создать поток для чтения файла. Это будет обзор высокого уровня, чтобы вы могли отслеживать соответствующие элементы. Сначала будет рассмотрен пункт 2, затем пункт 1.

Во-первых, вам нужно выполнить длительную обработку из потока пользовательского интерфейса. "Недействительная" реакция на время (приложение не отвечает) связано с тем, что вы связываете поток пользовательского интерфейса, который необходим для выполнения других действий. Нить не может читать файл и рисовать экран одновременно (по крайней мере, не очень хорошо).

Я нашел самый простой способ сделать это, используя Java ExecutorServices. То, что вы хотите сделать, это объединить логику для чтения файла или базы данных в Java Runnable или Callable, а затем запустить это с помощью ExecutorService. Исполнитель будет заботиться о том, чтобы начать поток и вернуть этот ресурс, когда он больше не используется.

Один из ключевых вопросов, о которых следует помнить, заключается в том, что после создания другого потока вы должны быть осторожны при обновлении пользовательского интерфейса. Поскольку объекты ui не являются потокобезопасными, вы можете обновлять ui только из потока пользовательского интерфейса (здравый смысл, правильно?). Если вы находитесь в действии, вы можете сделать это, вызвав runOnUiThread(), или вы можете создать свой собственный обработчик в одном из методов ACtivity, вызванных потоком пользовательского интерфейса, в первую очередь.

Сэм Дюфел сказал:

Хм... Вы действительно можете упаковать это, если бы вы могли прийти с форматом, чтобы заменить все фиктивные записи только счетом. Например, 10 000 нулей заменяются парой байтов флага, а затем 10 000

Кроме того, вы можете видеть увеличенную скорость, создавая несколько потоков чтения. Если вы можете разбить файл на два файла, которые позволят одновременно выполнять два потока, вы можете увидеть значительную скорость (в зависимости от того, что еще нужно сделать для данных). Это своего рода деление на захват для загрузки ваших данных из файла. Беглый поиск Google должен предоставить вам информацию о том, как загружать шорты из файла. Вы должны определенно рассмотреть возможность использования двоичного формата с учетом ваших спецификаций.

  • 0
    Справедливо. Но «нить - это зло» (!) :)
  • 0
    Пока вы здесь, у меня уже что-то работает, и мне придется беспокоиться о времени загрузки позже. Мое приложение просит устройство Android выполнить довольно сложный (но очень оптимизированный) расчет. Было бы хорошо, если бы мое приложение могло захватывать процессор во время вычислений, чтобы они выполнялись в разумные сроки. Возможно ли это (не создавая 100 собственных нитей для доминирования!)? (Просматривая документы по Android, кажется, что это не так, везде есть темы.) На новом iPhone вычисление занимает всего 0,1 секунды, а в симуляторе Android (из Eclipse) - 13 секунд.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню