Эквивалент сопоставленной памяти для FirefoxOS
Как бы вы эмулировали файл с отображенной памятью в FirefoxOS, Tizen или любом другом мобильном решении на основе чистого JS?
Вариант использования предназначен для мобильного браузера, и вам нужно много данных, которые не помещаются в ОЗУ или вы еще не хотите тратить на них ОЗУ и предпочитаете их ленивую загрузку.
Единственное, что я нашел, это IndexedDB или что я могу с этим сделать? Какие-нибудь лучшие трюки или API?
Хм, похоже, база данных Web SQL может быть решением для Android, Tizen или iOS. Но Firefox его не поддерживает (?)
Обновление: я спрашиваю из-за некоторых экспериментов
1 ответ
Прежде всего, Web SQL никогда не будет стандартизирован, как описано в спецификации, поэтому его следует рассматривать только для браузеров на основе WebKit/Blink.
В этом квесте есть потрясающий обзор вариантов автономного хранения, хотя листы карты рассматриваются в этом вопросе, я думаю, что он по-прежнему актуален для вашего варианта использования.
Я полагаю, что вы на правильном пути с IndexedDB для данных графика. На высоком уровне это хранилище асинхронных объектов со значением ключа (см. Документ " Основные понятия"). Для вашего случая использования вы можете индексировать узлы графа в хранилище объектов. Есть, например, библиотека LevelGraph, которая хранит графические данные в IndexedDB, хотя она построена для семантических веб-троек. HeliosJS также стоит упомянуть, хотя это графическая база данных в памяти.
Изменить: текущий API для IndexedDB является асинхронным. В спецификации разработан синхронный API, который может использоваться только веб-работниками. К сожалению, ни один движок в настоящее время не реализует эту функцию. Есть ожидающий патч для Gecko, но я не нашел никаких планов для Blink или WebKit, поэтому сейчас это не имеет смысла.
Доступ к необработанным файлам возможен через веб-API. Вы можете использовать XHR2 для загрузки (локального) файла в виде двоичного BLOB-объекта. К сожалению, XHR2 в основном предназначен для потоковой передачи файлов, а не для произвольного доступа, хотя вы можете разделить данные на несколько файлов и запрашивать их по требованию, но это может быть медленным. Прямой доступ к файлам в настоящее время довольно ограничен, FileList и createObjectURL в основном используются для прямого пользовательского ввода файла (через Drag and Drop или поле ввода файла), API-интерфейс FileSystem был недавно убит, а DeviceStorage является нестандартным и привилегированным (ОС Firefox -конкретный). Вы также можете хранить файлы в IndexedDB, которая описана для API FileHandle. Однако, как только вам удастся получить доступ к необработанному объекту File, вы можете использовать метод Blob.slice для загрузки фрагментов файла - есть отличный пример чтения фрагментов файла через форму загрузки. Вы также можете захотеть взглянуть на библиотеку jDataView и друзей, что облегчает обработку двоичных данных через более эффективный ArrayBuffer.
Редактировать: Что касается синхронного API, localStorage (он же DOM Storage) тоже может быть рассмотрен. Это также хранилище ключей-значений, но гораздо более простое и более ограниченное, чем IndexedDB:
- Размер хранилища ограничен, обычно до 5 МБ
- Только один localStorage на домен / приложение (вы можете иметь несколько именованных хранилищ объектов в IndexedDB).
- Только строки могут быть сохранены.
В общем, localStorage - это полезная замена куки, но она не очень полезна для хранения больших автономных данных.
Итак, подведем итог:
- IndexedDB - это самый простой и широко доступный вариант, хотя он может быть медленным, неэффективным или ограничивать объем памяти очень большими данными; Кроме того, только асинхронный API возможен в настоящее время.
- Доступ к необработанным файлам трудно получить без взаимодействия с пользователем, а API являются нестабильными и нестандартными.
В конце концов, вы можете комбинировать оба подхода, на ум приходят два варианта:
- Используйте XHR2 для разбора большого файла на куски и сохранения проанализированных узлов в IndexedDB
- Сохраните большой файл в IndexedDB (через XHR), используйте FileHandle.getFile, чтобы загрузить объект File, и Blob.slice, чтобы прочитать его содержимое.
Во всех случаях вы можете (должны) использовать Web Workers для обработки данных и расчетов в фоновом режиме.
В любом случае, GraphHopper выглядит великолепно, нам действительно не хватает таких нетривиальных автономных приложений для Firefox OS, так что удачи!