Какой самый быстрый способ использовать данные из двоичного файла в Android? - PullRequest
2 голосов
/ 18 октября 2011

У меня есть пара двоичных файлов, которые используются при обработке изображений, где данные находятся в плавающей форме и используются часто.Расчеты включают в себя умножение и сложение пикселей с изображений, снятых камерой.

В настоящее время файлы хранятся в виде ресурсов в папке / res, и я использую DataInputStream каждый раз, когда файл используется, когда данные считываются и вычисляются в одной функции.

Я относительно новичок в использовании файлов в приложениях, особенно на Android, и поэтому я хотел выяснить, есть ли лучшая практика для получения данных из файла, например, так как я использую те же данные поверхи снова лучше читать данные и сохранять их в массиве или даже в базе данных SQLite.Это приложение с дополненной реальностью, поэтому обработанные изображения необходимо отображать практически в реальном времени.

Большое спасибо заранее.

РЕДАКТИРОВАТЬ: Спасибо Patthoyts за ваш ответ, однако на другой вопрос, Почему люди говорят, что mmap от MappedByteBuffer быстрее? , я читал, что использование MappedByteBuffer не нужно, так как ячитаю свои данные последовательно каждый раз.Может ли кто-то с опытом работы в Android сказать мне, когда лучше прочитать данные в начале и сохранить их в большом массиве или буфере, или продолжать читать их из потока каждый раз, когда мне это нужно.Всего у меня около 50 000 значений с плавающей запятой.

1 Ответ

1 голос
/ 18 октября 2011

Вы можете использовать отображаемые в памяти файлы на Android, что означает, что данные могут быть выгружены в память ОС для быстрого доступа, пока что-то еще не потребуется памяти. Вам необходимо скопировать файл данных из вашего раздела res / raw или assets в файловую систему данных, но после этого вы можете использовать MappedByteBuffer для предоставления доступа. например:

FileInputStream inputstream = context.openFileInput(DATA_FILE_PATH);
FileChannel channel = inputstream.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
buffer.order(ByteOrder.LITTLE_ENDIAN);
IntBuffer intbuffer = buffer.asIntBuffer();

теперь доступен как последовательность целых чисел, используя intbuffer.get(index) и т. Д.

...