Рекомендуемая практика хранения больших объемов данных с помощью J2ME

StackOverflow https://stackoverflow.com/questions/19011

  •  09-06-2019
  •  | 
  •  

Вопрос

Я разрабатываю приложение J2ME, которое имеет большой объем данных для хранения на устройстве (в районе 1 МБ, но переменный).Я не могу полагаться на файловую систему, поэтому я застрял в системе управления записями (RMS), которая допускает несколько хранилищ записей, но каждое из них имеет ограниченный размер.Моя первоначальная целевая платформа, Blackberry, ограничивает каждый из них 64 КБ.

Мне интересно, приходилось ли кому-нибудь еще решать проблему хранения большого объема данных в RMS и как они с этим справлялись?Я подумываю о том, чтобы рассчитать размеры записей и разделить один набор данных по нескольким хранилищам, если он слишком велик, но это сильно усложняет сохранение его нетронутым.

Хранится множество различных типов данных, но только один конкретный набор превысит лимит в 64 КБ.

Это было полезно?

Решение

Для всего, что превышает несколько килобайт, вам нужно использовать либо JSR 75, либо удаленный сервер.Среднеквадратичные записи крайне ограничены по размеру и скорости даже в некоторых телефонах более высокого класса.Если вам нужно манипулировать 1 МБ данных в J2ME, единственный надежный и переносимый способ - это сохранить их в сети.Класс HttpConnection и методы GET и POST поддерживаются всегда.

На телефонах, поддерживающих файловое соединение JSR 75, это может быть допустимой альтернативой, но без подписи кода это кошмар для пользователя.Почти каждый отдельный вызов API вызывает запрос безопасности без общего выбора разрешения.Компаниям, которые развертывают приложения с JSR 75, обычно требуется полдюжины двоичных файлов для каждого порта, чтобы покрыть небольшую часть возможных сертификатов.И это только для сертификатов производителя;некоторые телефоны имеют сертификаты, привязанные только к оператору связи.

Другие советы

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

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

Лучше всего использовать JSR-75 там, где это доступно, и создать свой собственный интерфейс хранилища файлов, который возвращается к RMS, если ничего лучшего не поддерживается.

К сожалению, когда дело доходит до JavaME, вы часто втягиваетесь в написание вариантов вашего кода, зависящих от конкретного устройства.

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

Классическая книга Таненбаума по операционным системам описывается, как реализовать простую файловую систему, но я уверен, что вы можете найти другие ресурсы в Интернете, если вам не нравится бумага.

В Blackberry OS 4.6 предельный размер хранилища RMS был увеличен до 512 КБ, но это мало помогает, поскольку многие устройства, скорее всего, не будут поддерживать версию 4.6.Другой опцией в Blackberry является постоянное хранилище, размер записи в котором ограничен 64 КБ, но размер хранилища не ограничен (кроме физических ограничений устройства).

Я думаю, что Карлос и изб правы.

Это довольно просто, используйте JSR75 (FileConnection) и не забудьте подписать свой мидлет действительным (доверенным) сертификатом.

Для использования только для чтения я достигаю приемлемого времени (в течение 10 секунд) путем индексации файла ресурсов.У меня есть два экспорта прайс-листа размером ~ 800 КБ в формате CSV.Программные классы и оба этих файла сжимаются в банку объемом 300 КБ.

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

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

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

Спасибо всем за полезные комментарии.В конце концов, самым простым решением было ограничить объем хранимых данных, реализовав код, который корректирует данные в соответствии с размером хранилища, и извлекая данные с сервера по требованию, если они не хранятся локально.Интересно, что лимит увеличен в OS 4.6, если повезет, мой код просто скорректируется сам по себе и сохранит больше данных :)

Разработка приложения J2ME для Blackberry без использования компилятора .cod несколько ограничивает использование JSR 75, поскольку мы не можем подписать архив.Как отметил Карлос, это проблема на любой платформе, и у меня были похожие проблемы с использованием ее части PIM.RMS кажется невероятно медленной на платформе Blackberry, поэтому я не уверен, насколько полезной была бы файловая система inode / b-tree сверху, если только данные не были кэшированы в памяти и записаны в RMS в фоновом потоке с низким приоритетом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top