превышение квоты localStorage (размер localStorage! = размер загрузки файла) и как проверить размер localStorage - PullRequest
2 голосов
/ 28 апреля 2011

Я не мог придумать хорошего заголовка, так что надеюсь, что он подойдет.

Я занимаюсь созданием автономного веб-приложения на HTML5.«По определенным причинам» я не хочу, чтобы некоторые файлы помещались в манифест кэша, но вместо этого я хочу поместить содержимое в localStorage.

Все тестирование выполняется в Google Chrome для Mac / Mac OS 10.6.6

У меня есть 4 файла .JSON, которые имеют размер 3,120,792 байт.При первом посещении (онлайн) приложения я извлекаю этот контент JSON и помещаю его в одну строковую переменную, скажем str.Перед сохранением строки JSON я удаляю все \n и \t и заменяю \" на ', чтобы минимизировать длину строки.

Вот длина строки (длина строки вКонсоль Chrome):

original str : 3,117,764 (this is a concatenation of the contents of the 4 JSON files)
reformatted JSON: 2,732,249 (not too shabby - should save me a few bytes)

ОДНАКО, теперь, когда я пытаюсь сохранить эту строку в localStorage, я получаю сообщение об ошибке, превышающей размер кэша (Error: QUOTA_EXCEEDED_ERR: DOM Exception 22).НО НИЧЕГО еще не кэшировано для этой страницы (я вручную удалил все файлы кеша Google Chrome).

Почему это происходит?

Каков размер строки при хранении в кеше?

Как можно уменьшить этот размер, чтобы наилучшим образом использовать localStorage?

отредактировано, чтобы добавить: я попытался сохранить только 1 000 000 символов строки в localStorage (localStorage.setItem('x',str.substr(1,1000000)).Когда я проверял размер файла localStorage в папке кэша Chrome, он составлял 2 МБ.Это sqlite дБ.Похоже, что браузер использует фактический размер базы данных localStorage, а не размер данных, хранящихся в нем.Что, конечно, отстой, но, вероятно, стандартное поведение.Я полагаю, самая длинная строка, которую вы можете хранить в localStorage, где-то около 2 500 000 символов?

Ответы [ 3 ]

7 голосов
/ 14 июня 2011

Хороший способ узнать, сколько символов можно сохранить в локальном хранилище, - проверить его благодаря этой ссылке: http://arty.name/localstorage.html.

Размер зависит от реализации браузера HTML5

Мой последний тест: Chrome 13 / Safari 5 / IPAD 2: 2.600.000 chr FIREFOX 4: 5.200.000 ОПЕРА 11: неограниченно

4 голосов
/ 28 апреля 2011

http://jsfiddle.net/brucealdridge/j6KdJ/ 2 500 000 символов работает на моем ("5.0 (X11; Linux i686) AppleWebKit / 534.30 (KHTML, как Gecko) Ubuntu / 10.10 Chromium / 12.0.742.9 Chrome / 12.0.742.9 Safari / 534.30")3 000 000 нет.Я думал, что это может быть вещь кодирования, но я только что проверил, и это не

0 голосов
/ 13 апреля 2012

Странно, что ответ, иллюстрирующий максимальную сумму, будет принят.Разве вы не должны проверять текущий размер всех пар ключ / значение localStorage минус максимальные ограничения, установленные браузерами?

Вот jsfiddle , чтобы проиллюстрировать это использование.А для тех, кто хочет получить простой ответ, используйте следующий бит js ...

 function _calc() { return 1024 * 1024 * 5 - unescape(encodeURIComponent(JSON.stringify(localStorage))).length; }

ОБНОВЛЕНИЕ: Этот фрагмент гораздо точнее.

function _calc(s){var c,e=s||window.localStorage;for(var k in e){if(e.hasOwnProperty(k)){c+=e[k];}}return c?3+((c.length*16)/(8*1024)):0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...