Загрузка большой базы данных SQLite с сервера в двоичном виде вместо ее создания на устройстве - PullRequest
0 голосов
/ 31 августа 2011

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

Чтобы учесть проблемы OutOfMemory, которые у меня возникали с некоторыми устройствами, мне нужно было ограничить загрузку вызовов с сервера до 500 записей одновременно. Но на данный момент все вышеперечисленное работает успешно - хотя и медленно.

Недавно моя команда говорила о создании полной базы данных SQLite на стороне сервера, а затем просто о загрузке ее на устройство в двоичном виде, чтобы ускорить процесс. Я никогда не делал этого раньше. Действительно ли это приемлемый вариант, ИЛИ мне следует просто попытаться ускорить обработку JSON с помощью сторонних библиотек, таких как GSON или Jackson.

Заранее спасибо за ваш вклад.

1 Ответ

0 голосов
/ 05 декабря 2012

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

К сожалению, я могу дать вам только некоторые советы, которые вы можете рассмотреть,учитывая довольно расплывчатое описание проблем, с которыми вы сталкиваетесь.Я имею в виду, что «LOT» не имеет большого значения для меня - я видел мобильные приложения с БД, содержащими миллионы записей, которые работают довольно гладко, и те, у которых около 1 КБ записей работали ужасно медленно и вызывали зависание пользовательского интерфейса.Вы также не упомянули, какую версию ОС и устройство (или, по крайней мере, его возможности) вы используете.Какая конфигурация сервера, какое программное обеспечение установлено, какие библиотеки / фреймворки используются и в каких режимах.Все это имеет значение, когда вы хотите действительно ускорить процесс.

Помимо кодирования, являющегося gzip (которое, я считаю, вы оставили по умолчанию, то есть on), вы должны попробовать эту идею:

  1. Потоковое!- убедитесь, что и клиент и сервер используют потоковую версию JSON API и используют буферизованные потоки.Если ни один не делает - замените это библиотекой, которая делает.У Джексона один из самых быстрых потоковых API.Конечно, писать (де) сериализатор труднее, но это окупается.Если все сделано правильно, ни одна из сторон не должна создавать достаточно большой буфер для (де) сериализации всех данных, заполнять их содержимым, а затем анализировать / записывать его.Вместо этого намного меньший буфер выделяется и заполняется постепенно, когда последовательные поля сериализуютсяКогда этот буфер заполняется, его содержимое немедленно отправляется на другой конец канала данных.Там его можно сразу десериализовать.Процесс продолжается до тех пор, пока все данные не будут переданы небольшими порциями.Это делает обмен данными намного более плавным и менее ресурсоемким.
  2. Для больших пакетных вставок или обновлений используйте подготовленные операторы.Иногда это также помогает вставить ваши данные без ограничений и затем создать их - таким образом, например, индекс можно вычислить за один прогон, а не для каждой вставки.Не используйте транзакции (они требуют ведения дополнительных журналов базы данных) и не фиксируйте каждые 300 строк, чтобы минимизировать накладные расходы.Если вы обновляете существующую базу данных и необходимы атомарные модификации - загрузите новые данные во временную базу данных и, если все в порядке, замените старую базу данных новой на лету.
  3. Почти всегда некоторые данные можно предварительно вычислитьи хранится на SD-карте, например.Или его можно загрузить непосредственно на sd-карту в виде подготовленной базы данных SQLite в компании.Если для задачи требуются данные настолько большого размера, что импорт занимает более 10 минут, вам, вероятно, не следует выполнять эту задачу на мобильных устройствах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...