2012-01-06 2 views
1

В настоящее время я нахожусь в стадии планирования приложения Android , в котором мне нужно будет прочитать некоторые значения, хранящиеся в файлах. Значения будут поплавками неизвестной (но потенциально большой) суммы, которая в приложении будет помещена в FloatBuffer с при загрузке. Поплавковые значения будут представлены группами по пять и группами по три.Эффективное хранение массивов поплавка и коротких значений в файле

У меня не так много опыта, когда дело доходит до эффективного написания файла (или чтения), но моя идея состоит в том, чтобы создать файлы с помощью DataOutputStream, чтобы написать поплавки, которым предшествует индекс длины, описывающий количество пяти -группы. После этой суммы можно записать три группы.
Поскольку я пишу это, я также нашел FileChannel, который может помочь с чтением непосредственно в буферах, но я никогда не использовал это раньше и немного не знаю, как его использовать в этом случае.

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

Файл должен быть в состоянии:

  • содержат группы из пяти поплавков.
  • Содержит группы из трех поплавков. (Оба в том же файле)
  • При заказе. Очень важен порядок групп, а также порядок значений в группах.
  • Позволяет эффективно использовать (быстро и не слишком много) в FloatBuffer.

Файл не должен быть:

  • модифицируемых. Приложение будет читать только данные из файлов, они никогда не будут изменены после того, как они были.
  • Безопасный. Данные в файлах никогда не будут представлять ничего такого, как пароли или другие конфиденциальные данные.
  • Быстро писать. Создание файла будет сделано заранее, на компьютере. В мобильном приложении он будет доступен только для чтения.

Благодарим за ответы.

Редактировать: после некоторого быстрого и грязного тестирования, я сравнил производительность RandomAccessFile и буферизованного DataInputStream для чтения данных. Результаты показывают, что DataInputStream работает намного быстрее (10-100%, в зависимости от количества файлов).

+0

Вы также можете использовать «Сканер» для чтения из файла - или «RandomAccessFile» – fge

ответ

1

Если объем данных огромен, я все равно поеду с базой данных SQLite. С помощью Helper легко обрабатывать огромные объемы данных, и, насколько мне известно, благодаря эффективному обращению с запросами, он быстрый для случайного доступа к наборам данных (если вы хотите последовательно читать ваш файл, то это, вероятно, не быстрее, чем Dataoutputstream, потому что тогда процедура запроса SQL всегда будет запрашивать базу данных и обрабатывать результат, вместо того, чтобы просто увеличивать счетчик позиций в вашем файле на x).Я не уверен, что это самый быстрый способ, но это определенно удобный и быстрый способ.

2

Вы можете реализовать все это самостоятельно, но я бы рекомендовал вам подумать о базе данных. Andoroid поддерживает SQLite, поэтому возьмите его и используйте. Создайте 2 таблицы: GROUP5 и 'GROUP53`. Определите соответствующие индексы, и вы сможете хранить данные, извлекать их с помощью любой политики сортировки и т. Д.

Если вы по-прежнему предпочитаете делать свою собственную реализацию, я бы рекомендовал вам хранить данные в 2 файлах: один для 5 полей и другое для 3 полей. В этом случае вы всегда будете знать размер записи данных, так что вы будете иметь возможность использовать произвольный доступ (либо с помощью RandomAccessFile или с помощью mark() и skip() для регулярного FileInputStream.

Использование канала файла не имеет каких-либо преимуществ здесь. Это позволяет читать из нескольких файлов одновременно. Чтение из одного файла просто приводит к ухудшению производительности относительно регулярного FileInputStream (http://alexradzin.blogspot.com/2011/07/file-access-stream-vs-nio-channel.html).

+0

Благодарим вас за ответ, использование базы данных похоже на вариант, но на данный момент я хотел бы создать пользовательскую реализацию , Я рассмотрю RandomAccessFile и посмотрю, может ли это быть тем, что мне нужно. – Jave

Смежные вопросы