Хранение данных изображения для автономного веб-приложения (клиентская база данных хранения)

У меня есть автономное веб-приложение, использующее appcaching. Мне нужно предоставить около 10 МБ - 20 МБ данных, которые он сохранит (на стороне клиента), состоящий в основном из файлов изображений PNG. Операция следующая:

  • Веб-приложение загружается и устанавливается в appcache (использует манифест)
  • Запросы веб-приложений из файлов данных PNG сервера (как? - см. альтернативы ниже)
  • Иногда веб-приложение выполняет повторную синхронизацию с сервером и выполняет небольшие частичные обновления/удаления/добавления в базу данных PNG.
  • FYI: Сервер - это сервер JSON REST, который может размещать файлы в wwwroot для pickup

Вот мой текущий анализ клиентских "баз данных", которые обрабатывают двоичное хранилище blob

СМОТРЕТЬ ОБНОВЛЕНИЕ в нижней части

  • AppCache (через манифест добавить все PNG, а затем обновить по требованию)
    • CON: любое изменение элемента базы PNG будет означать полную загрузку всех элементов в манифесте (действительно плохие новости!)
  • WebStorage
  • PhoneGap и SQLLite
    • CON: Спонсор отклонит его как родное приложение, требующее сертификации
  • ZIP файл
    • Сервер создает zip файл, помещает его в wwwroot и уведомляет клиента
    • пользователь должен вручную распаковать (по крайней мере, так я его вижу) и сохранить в клиентской файловой системе
    • Веб-приложение использует API FileSystem для ссылки на файлы
    • CON: ZIP может быть слишком большим (zip64?), долгое время для создания
    • CON: Не уверен, что FileSystem API всегда может читать из песочницы (я так думаю)
  • USB или SD-карта (назад к каменному возрасту....)
    • Пользователь будет локальным на сервере перед выходом в автономный режим
    • Таким образом, мы могли бы вставить его в SD-карту, чтобы сервер заполнил ее PNG файлами.
    • Затем пользователь подключит его к ноутбуку, планшету
    • Веб-приложение будет использовать FileSystem API для чтения файлов
    • CON: Не уверен, что FileSystem API всегда может читать из песочницы (я так думаю)
  • WebSQL
    • CON: w3c отказался от него (довольно плохо)
    • Я мог бы рассмотреть Javascript-оболочку, которая использует индексированные индексы и WebSQL в качестве спада
  • API файловой системы
    • Chrome поддерживает чтение/запись blobs
    • CON: непонятно о IE и FireFox (IE10, имеет нестандартное msSave)
    • caniuse.com сообщает о поддержке IOS и Android (но опять же, это просто r/w JSON, или он включает полный API-интерфейс blob для написания?
    • CON: пользователям FireFox не нравится API-интерфейс FileSystem и не ясны, если они поддерживают сохранение капли: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
    • PRO: намного быстрее, чем IndexedDB для blobs в соответствии с jsperf http://jsperf.com/indexeddb-vs-localstorage/15 (стр. 2)
  • IndexedDB
    • Хорошая поддержка в IE10, FireFox (save, read blobs)
    • Хорошая скорость и удобство управления, чем файловая система (удаляет, обновляет)
    • PRO: см. тесты скорости: http://jsperf.com/indexeddb-vs-localstorage/15
    • См. эту статью о хранении и отображении изображений в IndexedDB: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
    • CON: Я подтвердил, что Chrome пока не поддерживает запись blob (текущая ошибка, но неясно, когда она будет исправлена)
    • ОБНОВЛЕНИЕ: разработчики Chrome подтверждают, что они работают над этим как для настольных, так и для Android! еще нет временной шкалы.
  • LawnChair Оболочка JavaScript http://brian.io/lawnchair/
    • PRO: очень чистая оболочка для IndexedDB, WebSQL или любой другой имеющейся у вас базы данных (подумайте polyfill)
    • CON: не может хранить двоичные капли, только данные: uri (кодировка base64) (возможно, фатальная ошибка из-за стоимости декодирования)
  • IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
    • Parashuram имеет ремиссионную симпатичную оболочку JQUERY для исходного интерфейса IndexedDB.
    • PRO: значительно упрощает использование IndexedDB, я надеялся добавить шайбу / polyfill для Chrome FileSystemAPI
    • CON: Он должен обрабатывать капли, но я не смог заставить его работать.
  • idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
    • Eric Bidelman @Google написал хорошо протестированный polyFill API FileSystem, который использует индексированную БД как откат
    • PRO: API FileSystem хорошо подходит для хранения blobs
    • PRO: отлично работает на FireFox и Chrome
      • PRO: отлично подходит для синхронизации с облачным CouchDB
    • CON: не понятно почему, но он не работает на IE10
  • Библиотека PouchDB JavaScript http://pouchdb.com/
    • отлично подходит для синхронизации CouchDB с локальной БД (использует либо WebSQL, либо IndexedDB (не моя проблема)
    • CON: NO CONS, PouchDB теперь поддерживает бинарные капли для всех последних браузеров (IE, Chrome, Firefox, Chrome на мобильных устройствах и т.д.), а также многие старые браузеры. Это было не так, когда я впервые сделал это сообщение.

ПРИМЕЧАНИЕ: чтобы увидеть данные: uri-кодирование PNG, я создал пример: http://jsbin.com/ivefak/1/edit

Желаемые/полезные/не входящие функции

  • Нет приложения native (EXE, PhoneGap, ObjectiveC и т.д.) на клиенте (чистое веб-приложение)
  • Для работы с новейшими Chrome, FireFox, IE10 для ноутбуков требуется только
  • Сильно хочу, чтобы такое же решение для Android Tablet (IOS было бы неплохо), но нужен только один браузер для работы (FF, Chrome и т.д.).
  • Быстрая начальная численность DB
  • ТРЕБОВАНИЕ: очень быстрое извлечение изображений с помощью веб-приложения из хранилища (DB, file)
  • Не предназначен для потребителей. Мы можем ограничить браузеры и попросить пользователя выполнить специальную настройку и задачи, но свести к минимуму, что

Индексированные версии DB

  • Существует отличная статья о том, как IE, FF и Chrome реализуют это внутри: http://www.aaron-powell.com/web/indexeddb-storage
  • Короче:
    • IE использует тот же формат базы данных, что и Exchange и Active Directory для IndexedDB
    • Firefox использует SQLite, так что это реализация базы данных NoSQL в базе данных SQL
    • Chrome (и WebKit) используют хранилище Key/Value, имеющее наследие в BigTable

Мои текущие результаты

  • Я решил использовать подход IndexedDB (и polyFill с FileSystemAPI для Chrome до тех пор, пока не отправит поддержку blob)
  • Для извлечения плиток у меня была дилемма, так как люди JQUERY kvetching добавили это в AJAX
  • Я пошел с XHR2-Lib Phil Parsons, который очень похож на JQUERY.ajax() https://github.com/p-m-p/xhr2-lib
  • Производительность для загрузки 100 МБ (IE10 4s, Chrome 6s, FireFox 7s).
  • Я не мог заставить ни одну из оберток IndexedDB работать для blobs (lawnchair, PouchDB, jquery-indexeddb и т.д.).
  • Я перевернул свою собственную оболочку, и производительность (IE10 2s, Chrome 3s, FireFox 10s)
  • С FF я предполагаю, что мы видим проблему с производительностью использования реляционной БД (sqllite) для хранения без sql
  • ПРИМЕЧАНИЕ. У Chrome есть выдающиеся инструменты отладки (вкладка разработчика, ресурсы) для проверки состояния IndexedDB.

ЗАКЛЮЧИТЕЛЬНЫЕ Результаты, представленные ниже как ответ

Update

Теперь PouchDB поддерживает бинарные капли для всех последних браузеров (IE, Chrome, Firefox, Chrome на мобильных устройствах и т.д.), а также многие старые браузеры. Это было не так, когда я впервые сделал это сообщение.

Ответ 1

Результаты Offline blob cache для слайд-карт PNG

Тестирование

  • 171 PNG файлов (всего 3,2 МБ)
  • Тестирование платформ: Chrome v24, FireFox 18, IE 10
  • Также следует работать с Chrome и FF для Android.

Получение с веб-сервера

  • с помощью XHR2 (поддерживается практически во всех браузерах) для загрузки блога с веб-сервера
  • Я пошел с XHR2-Lib Филом Парсонсом, который очень похож на JQUERY.ajax()

хранения

  • IndexedDB для IE и FireFox
  • Chrome: Polyfill (blob хранится с использованием API FileSystem, ссылка хранится в IndexedDB) polyfill
  • A Должен прочитать статью "Как браузеры хранят данные IndexedDB"
  • Примечание. FireFox использует SQLlite для NOSQL IndexedDB. Это может быть причиной медленной работы. (капли хранятся отдельно)
  • Примечание. Microsoft IE использует расширяемый механизм хранения:
  • Примечание. Chrome использует LevelDB http://code.google.com/p/leveldb/

Экран

  • Я использую Leaflet http://leafletjs.com/, чтобы показать фрагменты карты
  • Я использовал плагин функционального слоя плитки Ishmael Smyrnow для извлечения слоя плитки из БД
  • Я сравнил слой плиток на основе БД с чисто локальным (localhost://) хранилищем
  • Нет заметной разницы в производительности! между использованием IndexedDB и локальными файлами!

Результаты

  • Chrome: Fetch (6.551s), Store (8.247s), Total Истекшее время: (13.714s)
  • FireFox: Fetch (0.422s), Store (31.519s), Total Истекшее время: (32.836s)
  • IE 10: Fetch (0.668s), Store: (0.896s), Общее истекшее время: (3.758s)

Ответ 2

Для ваших требований я предлагаю разработать новый polyfill на основе двух других: API FileSystem для IndexedDB и IndexedDB для WebSQL - лучший вариант.

Первый будет поддерживать поддержку для хранения blob в Chrome (FileSystem API) и Firefox (IndexedDB), в то время как последний должен обеспечить поддержку Android и iOS (WebSQL). Нужно просто заставить эти полисы работать вместе, и я полагаю, что это не сложно.

NB: Так как я не мог найти информацию в Интернете об этом, вы должны проверить, будет ли хранение blobs с использованием WebSQL polyfill работать на iOS и Android. Похоже, что он должен работать:

var sql = ["CREATE TABLE", idbModules.util.quote(storeName), "(key BLOB", createOptions.autoIncrement ? ", inc INTEGER PRIMARY KEY AUTOINCREMENT" : "PRIMARY KEY", ", value BLOB)"].join(" ")

Источник

Ответ 3

Несколько лет назад (не совсем каменный век) я использовал подписанный Java-апплет, который запрашивал бы его сервер для синхронизации/обновления требований, загружал соответствующие файлы с сервера и сохранял их в пользовательской файловой системе (а не в базе данных). Это решение может работать для вас, хотя вам понадобится кто-то, чтобы написать апплет и подписать его. Для решений для баз данных такой апплет может использовать jdbc, доступный для большинства баз данных, используя localhost на подходящем порту (например, 3306 для MySQL). Я считаю, что тег апплета устарел в Html5, но он все еще работает. Нет опыта работы с планшетами Android, поэтому не могу комментировать эту часть.

Ответ 4

У меня есть кэширование карт примеры (открытый пример, обнаружение областей и масштабирования, возможность переключения в автономном режиме и обнаруженные области будут доступны).

Есть map.js - слой карты для автономных плит, storage.js - реализация хранилища на основе IndexedDb и WebSQL (но это просто тестовая реализация с низкой производительностью).

  • Для файлов сайта (html, css, js и т.д.) я предпочитаю использовать кэш приложений.
  • Для хранения я предпочитаю использовать индексированный DB (поддержка blob), Web SQL (только base64), FileWriter (поддержка blob, но только хром). Честно говоря, это большая проблема. Вам нужно самое быстрое решение ключевых значений, которое будет смешивать их все. Я считаю правильным решение использовать существующее решение.
  • Для загрузки я использовал холст с CORS. Но я думаю о WebWorkers и XHR2, и это может быть лучше, чем холст, потому что у холста есть некоторые проблемы с CORS в разных браузерах и других (например этот заголовок был сохранен bad in opera).

Дополнительная информация о размерах для 2 миллиардов городов (Минск):

  • Zoom - 9, плитки - 2, размер - 52 kb, с предыдущими - 52 kb;
  • Zoom - 10, плитка - 3, размер - 72 kb, с предыдущим - 124 kb;
  • Zoom - 11, плитка - 7, размер - 204 kb, с предыдущим - 328 kb;
  • Zoom - 12, плитки - 17, размер - 348 kb, с предыдущим - 676 ​​kb;
  • Zoom - 13, плитка - 48, размер - 820 kb, с предыдущей - 1,5 мб;
  • Zoom - 14, плитки - 158, размер - 2,2 мб, с предыдущими - 3,7 мб;
  • Zoom - 15, плитки - 586, размер - 5,5 мб, с предыдущим - 9,3 мб;
  • Zoom - 16, плитки - 2264, размер - 15 мб, с предыдущим - 24,3 мб;