Эффективное хранение массивов с плавающей и коротких значений в файле - PullRequest
1 голос
/ 06 января 2012

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

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

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

Файл должен иметь возможность:

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

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

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

Спасибо за ваши ответы.

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

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Вы можете реализовать все это самостоятельно, но я бы порекомендовал вам подумать о базе данных. 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).

1 голос
/ 06 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...